home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1997 #3 / Amiga Plus CD - 1997 - No. 03.iso / pd / programmierung / alienbreed3d2_src / cheesesauce / chunky2planar.s < prev    next >
Text File  |  1997-01-31  |  54KB  |  2,230 lines

  1. ;      _______  ___                    ___        _______
  2. ;     /°-     \/. /    _____   ____   / ./       /°-     \
  3. ;     \   \___//  \___/°    \_/°   \_/   \___    \   \___/
  4. ;    _/\__    \      ~\_  /\  \  /\ ~\      °\_ _/\__    \
  5. ;    \\       /   /\   /  \/. /  \/   \ //\   / \\       /
  6. ;     \______/\__/  \_/\_____/\____/\_/_/  \_/ o \______/ Issue 1
  7.  
  8. ;The following are a few example of converting chunky data to normal planar
  9. ;data. I'm sorry, but I'm not sure who wrote these, but thanks a lot anyway.
  10. ;I've put all the examples in one file, so you'll have to cut & paste them
  11. ;yourself.    Squize 18/12/94
  12.  
  13.  
  14.                             O /
  15. ------CUT-OUT----------------X-----------------------------------------------
  16.                             O \
  17. ;
  18. ; Hi James,
  19. ;
  20. ; I suddenly saw how to use eor.l to shave a few more cycles.  Now it's
  21. ; 67.0 cycles/pixel with no nasty tricks.  (Use a7 as another bitplane
  22. ; pointer to get 66.5 cycles/pixel.)  It's still untested.
  23. ;
  24. ; I think I've about reached my limit, unless someone gives me some more
  25. ; clues.
  26. ;
  27. ; Regards, Peter.
  28.  
  29.         xdef    _chunky2planar
  30.  
  31. ;-----------------------------------------------------------------------------
  32. ; chunky2planar:    (new Motorola syntax)
  33. ;  a0 -> chunky pixels
  34. ;  a1 -> plane0 (assume other 7 planes are allocated contiguously)
  35. ; d0-d1/a0-a1 are trashed
  36.  
  37.  
  38. width        equ    320        ; must be a multiple of 8
  39. height        equ    200
  40. plsiz        equ    (width/8)*height
  41.  
  42. _chunky2planar:
  43.  
  44.         movem.l    d2-d7/a2-a6,-(sp)
  45.  
  46. ; set up register constants
  47.  
  48.         move.l    #$0f0f0f0f,d5    ; d5 = constant $0f0f0f0f
  49.         move.l    #$55555555,d6    ; d6 = constant $55555555
  50.         move.l    #$3333cccc,d7    ; d7 = constant $3333cccc
  51.         lea    (plsiz,a1),a2    ; a2 -> plane1 (end of plane0)
  52.  
  53. ; load up (otherwise) unused address registers with bitplane ptrs
  54.  
  55.         movea.l    a2,a3        ; a3 -> plane1
  56.         lea    (2*plsiz,a1),a4    ; a4 -> plane2
  57.         lea    (2*plsiz,a4),a5    ; a5 -> plane4
  58.         lea    (2*plsiz,a5),a6    ; a6 -> plane6
  59.  
  60. ; main loop (starts here) processes 8 chunky pixels at a time
  61.  
  62. mainloop:
  63.  
  64. ; d0 = a7a6a5a4a3a2a1a0 b7b6b5b4b3b2b1b0 c7c6c5c4c3c2c1c0 d7d6d5d4d3d2d1d0
  65.  
  66.         move.l    (a0)+,d0    ; 12 get next 4 chunky pixels in d0
  67.  
  68. ; d1 = e7e6e5e4e3e2e1e0 f7f6f5f4f3f2f1f0 g7g6g5g4g3g2g1g0 h7h6h5h4h3h2h1h0
  69.  
  70.         move.l    (a0)+,d1    ; 12 get next 4 chunky pixels in d1
  71.  
  72. ; d2 = d0 & 0f0f0f0f
  73. ; d2 = ........a3a2a1a0 ........b3b2b1b0 ........c3c2c1c0 ........d3d2d1d0
  74.  
  75.         move.l    d0,d2        ;  4
  76.         and.l    d5,d2        ;  8 d5=$0f0f0f0f
  77.  
  78. ; d0 ^= d2
  79. ; d0 = a7a6a5a4........ b7b6b5b4........ c7c6c5c4........ d7d6d5d4........
  80.  
  81.         eor.l    d2,d0        ;  8
  82.  
  83. ; d3 = d1 & 0f0f0f0f
  84. ; d3 = ........e3e2e1e0 ........f3f2f1f0 ........g3g2g1g0 ........h3h2h1h0
  85.  
  86.         move.l    d1,d3        ;  4
  87.         and.l    d5,d3        ;  8 d5=$0f0f0f0f
  88.  
  89. ; d1 ^= d3
  90. ; d1 = e7e6e5e4........ f7f6f5f4........ g7g6g5g4........ h7h6h5h4........
  91.  
  92.         eor.l    d3,d1        ;  8
  93.  
  94. ; d2 = (d2 << 4) | d3
  95. ; d2 = a3a2a1a0e3e2e1e0 b3b2b1b0f3f2f1f0 c3c2c1c0g3g2g1g0 d3d2d1d0h3h2h1h0
  96.  
  97.         lsl.l    #4,d2        ; 16
  98.         or.l    d3,d2        ;  8
  99.  
  100. ; d0 = d0 | (d1 >> 4)
  101. ; d0 = a7a6a5a4e7e6e5e4 b7b6b5b4f7f6f5f4 c7c6c5c4g7g6g5g4 d7d6d5d4h7h6h5h4
  102.  
  103.         lsr.l    #4,d1        ; 16
  104.         or.l    d1,d0        ;  8
  105.  
  106. ; d3 = ((d2 & 33330000) << 2) | (swap(d2) & 3333cccc) | ((d2 & 0000cccc) >> 2)
  107. ; d3 = a1a0c1c0e1e0g1g0 b1b0d1d0f1f0h1h0 a3a2c3c2e3e2g3g2 b3b2d3d2f3f2h3h2
  108.  
  109.         move.l    d2,d3        ;  4
  110.         and.l    d7,d3        ;  8 d7=$3333cccc
  111.         move.w    d3,d1        ;  4
  112.         clr.w    d3        ;  4
  113.         lsl.l    #2,d3        ; 12
  114.         lsr.w    #2,d1        ; 10
  115.         or.w    d1,d3        ;  4
  116.         swap    d2        ;  4
  117.         and.l    d7,d2        ;  8 d7=$3333cccc
  118.         or.l    d2,d3        ;  8
  119.  
  120. ; d1 = ((d0 & 33330000) << 2) | (swap(d0) & 3333cccc) | ((d0 & 0000cccc) >> 2)
  121. ; d1 = a5a4c5c4e5e4g5g4 b5b4d5d4f5f4h5h4 a7a6c7c6e7e6g7g6 b7b6d7d6f7f6h7h6
  122.  
  123.         move.l    d0,d1        ;  4
  124.         and.l    d7,d1        ;  8 d7=$3333cccc
  125.         move.w    d1,d2        ;  4
  126.         clr.w    d1        ;  4
  127.         lsl.l    #2,d1        ; 12
  128.         lsr.w    #2,d2        ; 10
  129.         or.w    d2,d1        ;  4
  130.         swap    d0        ;  4
  131.         and.l    d7,d0        ;  8 d7=$3333cccc
  132.         or.l    d0,d1        ;  8
  133.  
  134. ; d2 = d1 >> 7
  135. ; d2 = ..............a5 a4c5c4e5e4g5g4b5 b4d5d4f5f4h5h4a7 a6c7c6e7e6g7g6..
  136.  
  137.         move.l    d1,d2        ;  4
  138.         lsr.l    #7,d2        ; 22
  139.  
  140. ; d0 = d1 & 55555555
  141. ; d0 = ..a4..c4..e4..g4 ..b4..d4..f4..h4 ..a6..c6..e6..g6 ..b6..d6..f6..h6
  142.  
  143.         move.l    d1,d0        ;  4
  144.         and.l    d6,d0        ;  8 d6=$55555555
  145.  
  146. ; d1 ^= d0
  147. ; d1 = a5..c5..e5..g5.. b5..d5..f5..h5.. a7..c7..e7..g7.. b7..d7..f7..h7..
  148.  
  149.         eor.l    d0,d1        ;  8
  150.  
  151. ; d4 = d2 & 55555555
  152. ; d4 = ..............a5 ..c5..e5..g5..b5 ..d5..f5..h5..a7 ..c7..e7..g7....
  153.  
  154.         move.l    d2,d4        ;  4
  155.         and.l    d6,d4        ;  8 d6=$55555555
  156.  
  157. ; d2 ^= d4
  158. ; d2 = ................ a4..c4..e4..g4.. b4..d4..f4..h4.. a6..c6..e6..g6..
  159.  
  160.         eor.l    d4,d2        ;  8
  161.  
  162. ; d1 = (d1 | d4) >> 1
  163. ; d1 = ................ a5b5c5d5e5f5g5h5 ................ a7b7c7d7e7f7g7h7
  164.  
  165.         or.l    d4,d1        ;  8
  166.         lsr.l    #1,d1        ; 10
  167.  
  168.         move.b    d1,(plsiz,a6)    ; 12 plane 7
  169.         swap    d1        ;  4
  170.         move.b    d1,(plsiz,a5)    ; 12 plane 5
  171.  
  172. ; d2 |= d0
  173. ; d2 = ................ a4b4c4d4e4f4g4h4 ................ a6b6c6d6e6f6g6h6
  174.  
  175.         or.l    d0,d2        ;  8
  176.  
  177.         move.b    d2,(a6)+    ;  8 plane 6
  178.         swap    d2        ;  4
  179.         move.b    d2,(a5)+    ;  8 plane 4
  180.  
  181. ; d2 = d3 >> 7
  182. ; d2 = ..............a1 a0c1c0e1e0g1g0b1 b0d1d0f1f0h1h0a3 a2c3c2e3e2g3g2..
  183.  
  184.         move.l    d3,d2        ;  4
  185.         lsr.l    #7,d2        ; 22
  186.  
  187. ; d0 = d3 & 55555555
  188. ; d0 = ..a0..c0..e0..g0 ..b0..d0..f0..h0 ..a2..c2..e2..g2 ..b2..d2..f2..h2
  189.  
  190.         move.l    d3,d0        ;  4
  191.         and.l    d6,d0        ;  8 d6=$55555555
  192.  
  193. ; d3 ^= d0
  194. ; d3 = a1..c1..e1..g1.. b1..d1..f1..h1.. a3..c3..e3..g3.. b3..d3..f3..h3..
  195.  
  196.         eor.l    d0,d3        ;  8
  197.  
  198. ; d4 = d2 & 55555555
  199. ; d4 = ..............a1 ..c1..e1..g1..b1 ..d1..f1..h1..a3 ..c3..e3..g3....
  200.  
  201.         move.l    d2,d4        ;  4
  202.         and.l    d6,d4        ;  8 d6=$55555555
  203.  
  204. ; d2 ^= d4
  205. ; d2 = ................ a0..c0..e0..g0.. b0..d0..f0..h0.. a2..c2..e2..g2..
  206.  
  207.         eor.l    d4,d2        ;  8
  208.  
  209. ; d3 = (d3 | d4) >> 1
  210. ; d3 = ................ a1b1c1d1e1f1g1h1 ................ a3b3c3d3e3f3g3h3
  211.  
  212.         or.l    d4,d3        ;  8
  213.         lsr.l    #1,d3        ; 10
  214.  
  215.         move.b    d3,(plsiz,a4)    ; 12 plane 3
  216.         swap    d3        ;  4
  217.         move.b    d3,(a3)+    ;  8 plane 1
  218.  
  219. ; d2 = d2 | d0
  220. ; d2 = ................ a0b0c0d0e0f0g0h0 ................ a2b2c2d2e2f2g2h2
  221.  
  222.         or.l    d0,d2        ;  8
  223.  
  224.         move.b    d2,(a4)+    ;  8 plane 2
  225.         swap    d2        ;  4
  226.         move.b    d2,(a1)+    ;  8 plane 0
  227.  
  228. ; test if finished
  229.  
  230.         cmpa.l    a1,a2        ;  6
  231.         bne.w    mainloop    ; 10    total=536 (67.0 cycles/pixel)
  232.  
  233.         movem.l    (sp)+,d2-d7/a2-a6
  234.  
  235.         rts
  236.  
  237. ;-----------------------------------------------------------------------------
  238.  
  239.         end
  240.  
  241.                             O /
  242. ------CUT-OUT----------------X-----------------------------------------------
  243.                             O \
  244.  
  245.         xdef    _chunky2planar
  246.  
  247. ; peterm/chunky4.s
  248.  
  249. ; Basically the same as peterm/chunky3.s, except use Chris Hames' idea
  250. ; of temporary FAST buffers to allow longword writes to CHIP RAM.
  251.  
  252. ;-----------------------------------------------------------------------------
  253. ; chunky2planar:    (new Motorola syntax)
  254. ;  a0 -> chunky pixels
  255. ;  a1 -> plane0 (assume other 7 planes are allocated contiguously)
  256.  
  257.  
  258. width        equ    320        ; must be a multiple of 32
  259. height        equ    200
  260. plsiz        equ    (width/8)*height
  261.  
  262. _chunky2planar:
  263.  
  264.         movem.l    d2-d7/a2-a6,-(sp)
  265.  
  266.         move.w    sp,d0
  267.         and.w    #2,d0
  268.         add.w    #32,d0        ; make room on stack for
  269.         suba.w    d0,sp        ; 32-byte longword aligned buffer
  270.         movea.l    sp,a3        ; pointed to by a3
  271.         move.w    d0,-(sp)    ; and save the allocated size
  272.         move.w    #plsiz/4,-(sp)    ; outer loop counter on stack
  273.  
  274.     iflt 4*plsiz-4-32768
  275.         adda.w    #3*plsiz,a1    ; a1 -> start of plane 3
  276.     else
  277.     iflt 2*plsiz-4-32768
  278.         adda.w    #1*plsiz,a1    ; a1 -> start of plane 1
  279.     endc
  280.     endc
  281.  
  282. ; set up register constants
  283.  
  284.         move.l    #$0f0f0f0f,d5    ; d5 = constant $0f0f0f0f
  285.         move.l    #$55555555,d6    ; d6 = constant $55555555
  286.         move.l    #$3333cccc,d7    ; d7 = constant $3333cccc
  287.         lea    (4,a3),a2    ; used for inner loop end test
  288.  
  289. ; load up address registers with buffer ptrs
  290.  
  291.         lea    (2*4,a3),a4    ; a4 -> plane2buf
  292.         lea    (2*4,a4),a5    ; a5 -> plane4buf
  293.         lea    (2*4,a5),a6    ; a6 -> plane6buf
  294.  
  295. ; main loop (starts here) processes 8 chunky pixels at a time
  296.  
  297. mainloop:
  298.  
  299. ; d0 = a7a6a5a4a3a2a1a0 b7b6b5b4b3b2b1b0 c7c6c5c4c3c2c1c0 d7d6d5d4d3d2d1d0
  300.  
  301.         move.l    (a0)+,d0    ; 12 get next 4 chunky pixels in d0
  302.  
  303. ; d1 = e7e6e5e4e3e2e1e0 f7f6f5f4f3f2f1f0 g7g6g5g4g3g2g1g0 h7h6h5h4h3h2h1h0
  304.  
  305.         move.l    (a0)+,d1    ; 12 get next 4 chunky pixels in d1
  306.  
  307. ; d2 = d0 & 0f0f0f0f
  308. ; d2 = ........a3a2a1a0 ........b3b2b1b0 ........c3c2c1c0 ........d3d2d1d0
  309.  
  310.         move.l    d0,d2        ;  4
  311.         and.l    d5,d2        ;  8 d5=$0f0f0f0f
  312.  
  313. ; d0 ^= d2
  314. ; d0 = a7a6a5a4........ b7b6b5b4........ c7c6c5c4........ d7d6d5d4........
  315.  
  316.         eor.l    d2,d0        ;  8
  317.  
  318. ; d3 = d1 & 0f0f0f0f
  319. ; d3 = ........e3e2e1e0 ........f3f2f1f0 ........g3g2g1g0 ........h3h2h1h0
  320.  
  321.         move.l    d1,d3        ;  4
  322.         and.l    d5,d3        ;  8 d5=$0f0f0f0f
  323.  
  324. ; d1 ^= d3
  325. ; d1 = e7e6e5e4........ f7f6f5f4........ g7g6g5g4........ h7h6h5h4........
  326.  
  327.         eor.l    d3,d1        ;  8
  328.  
  329. ; d2 = (d2 << 4) | d3
  330. ; d2 = a3a2a1a0e3e2e1e0 b3b2b1b0f3f2f1f0 c3c2c1c0g3g2g1g0 d3d2d1d0h3h2h1h0
  331.  
  332.         lsl.l    #4,d2        ; 16
  333.         or.l    d3,d2        ;  8
  334.  
  335. ; d0 = d0 | (d1 >> 4)
  336. ; d0 = a7a6a5a4e7e6e5e4 b7b6b5b4f7f6f5f4 c7c6c5c4g7g6g5g4 d7d6d5d4h7h6h5h4
  337.  
  338.         lsr.l    #4,d1        ; 16
  339.         or.l    d1,d0        ;  8
  340.  
  341. ; d3 = ((d2 & 33330000) << 2) | (swap(d2) & 3333cccc) | ((d2 & 0000cccc) >> 2)
  342. ; d3 = a1a0c1c0e1e0g1g0 b1b0d1d0f1f0h1h0 a3a2c3c2e3e2g3g2 b3b2d3d2f3f2h3h2
  343.  
  344.         move.l    d2,d3        ;  4
  345.         and.l    d7,d3        ;  8 d7=$3333cccc
  346.         move.w    d3,d1        ;  4
  347.         clr.w    d3        ;  4
  348.         lsl.l    #2,d3        ; 12
  349.         lsr.w    #2,d1        ; 10
  350.         or.w    d1,d3        ;  4
  351.         swap    d2        ;  4
  352.         and.l    d7,d2        ;  8 d7=$3333cccc
  353.         or.l    d2,d3        ;  8
  354.  
  355. ; d1 = ((d0 & 33330000) << 2) | (swap(d0) & 3333cccc) | ((d0 & 0000cccc) >> 2)
  356. ; d1 = a5a4c5c4e5e4g5g4 b5b4d5d4f5f4h5h4 a7a6c7c6e7e6g7g6 b7b6d7d6f7f6h7h6
  357.  
  358.         move.l    d0,d1        ;  4
  359.         and.l    d7,d1        ;  8 d7=$3333cccc
  360.         move.w    d1,d2        ;  4
  361.         clr.w    d1        ;  4
  362.         lsl.l    #2,d1        ; 12
  363.         lsr.w    #2,d2        ; 10
  364.         or.w    d2,d1        ;  4
  365.         swap    d0        ;  4
  366.         and.l    d7,d0        ;  8 d7=$3333cccc
  367.         or.l    d0,d1        ;  8
  368.  
  369. ; d2 = d1 >> 7
  370. ; d2 = ..............a5 a4c5c4e5e4g5g4b5 b4d5d4f5f4h5h4a7 a6c7c6e7e6g7g6..
  371.  
  372.         move.l    d1,d2        ;  4
  373.         lsr.l    #7,d2        ; 22
  374.  
  375. ; d0 = d1 & 55555555
  376. ; d0 = ..a4..c4..e4..g4 ..b4..d4..f4..h4 ..a6..c6..e6..g6 ..b6..d6..f6..h6
  377.  
  378.         move.l    d1,d0        ;  4
  379.         and.l    d6,d0        ;  8 d6=$55555555
  380.  
  381. ; d1 ^= d0
  382. ; d1 = a5..c5..e5..g5.. b5..d5..f5..h5.. a7..c7..e7..g7.. b7..d7..f7..h7..
  383.  
  384.         eor.l    d0,d1        ;  8
  385.  
  386. ; d4 = d2 & 55555555
  387. ; d4 = ..............a5 ..c5..e5..g5..b5 ..d5..f5..h5..a7 ..c7..e7..g7....
  388.  
  389.         move.l    d2,d4        ;  4
  390.         and.l    d6,d4        ;  8 d6=$55555555
  391.  
  392. ; d2 ^= d4
  393. ; d2 = ................ a4..c4..e4..g4.. b4..d4..f4..h4.. a6..c6..e6..g6..
  394.  
  395.         eor.l    d4,d2        ;  8
  396.  
  397. ; d1 = (d1 | d4) >> 1
  398. ; d1 = ................ a5b5c5d5e5f5g5h5 ................ a7b7c7d7e7f7g7h7
  399.  
  400.         or.l    d4,d1        ;  8
  401.         lsr.l    #1,d1        ; 10
  402.  
  403.         move.b    d1,(4,a6)    ; 12 plane 7
  404.         swap    d1        ;  4
  405.         move.b    d1,(4,a5)    ; 12 plane 5
  406.  
  407. ; d2 |= d0
  408. ; d2 = ................ a4b4c4d4e4f4g4h4 ................ a6b6c6d6e6f6g6h6
  409.  
  410.         or.l    d0,d2        ;  8
  411.  
  412.         move.b    d2,(a6)+    ;  8 plane 6
  413.         swap    d2        ;  4
  414.         move.b    d2,(a5)+    ;  8 plane 4
  415.  
  416. ; d2 = d3 >> 7
  417. ; d2 = ..............a1 a0c1c0e1e0g1g0b1 b0d1d0f1f0h1h0a3 a2c3c2e3e2g3g2..
  418.  
  419.         move.l    d3,d2        ;  4
  420.         lsr.l    #7,d2        ; 22
  421.  
  422. ; d0 = d3 & 55555555
  423. ; d0 = ..a0..c0..e0..g0 ..b0..d0..f0..h0 ..a2..c2..e2..g2 ..b2..d2..f2..h2
  424.  
  425.         move.l    d3,d0        ;  4
  426.         and.l    d6,d0        ;  8 d6=$55555555
  427.  
  428. ; d3 ^= d0
  429. ; d3 = a1..c1..e1..g1.. b1..d1..f1..h1.. a3..c3..e3..g3.. b3..d3..f3..h3..
  430.  
  431.         eor.l    d0,d3        ;  8
  432.  
  433. ; d4 = d2 & 55555555
  434. ; d4 = ..............a1 ..c1..e1..g1..b1 ..d1..f1..h1..a3 ..c3..e3..g3....
  435.  
  436.         move.l    d2,d4        ;  4
  437.         and.l    d6,d4        ;  8 d6=$55555555
  438.  
  439. ; d2 ^= d4
  440. ; d2 = ................ a0..c0..e0..g0.. b0..d0..f0..h0.. a2..c2..e2..g2..
  441.  
  442.         eor.l    d4,d2        ;  8
  443.  
  444. ; d3 = (d3 | d4) >> 1
  445. ; d3 = ................ a1b1c1d1e1f1g1h1 ................ a3b3c3d3e3f3g3h3
  446.  
  447.         or.l    d4,d3        ;  8
  448.         lsr.l    #1,d3        ; 10
  449.  
  450.         move.b    d3,(4,a4)    ; 12 plane 3
  451.         swap    d3        ;  4
  452.         move.b    d3,(4,a3)    ; 12 plane 1
  453.  
  454. ; d2 = d2 | d0
  455. ; d2 = ................ a0b0c0d0e0f0g0h0 ................ a2b2c2d2e2f2g2h2
  456.  
  457.         or.l    d0,d2        ;  8
  458.  
  459.         move.b    d2,(a4)+    ;  8 plane 2
  460.         swap    d2        ;  4
  461.         move.b    d2,(a3)+    ;  8 plane 0
  462.  
  463. ; test if stack buffers are full, loop back if not
  464.  
  465.         cmpa.l    a3,a2        ;  6
  466.         bne.w    mainloop    ; 10    total=540 (67.5 cycles/pixel)
  467.  
  468. ; move stack buffers to bitplanes (longword writes) and restore ptrs
  469.  
  470.     iflt 4*plsiz-4-32768            ; a1 points into plane 3
  471.         move.l    (a4),(a1)+        ; plane 3
  472.         move.l    (a6),(4*plsiz-4,a1)    ; plane 7
  473.         move.l    -(a6),(3*plsiz-4,a1)    ; plane 6
  474.         move.l    (a5),(2*plsiz-4,a1)    ; plane 5
  475.         move.l    -(a5),(1*plsiz-4,a1)    ; plane 4
  476.         move.l    -(a4),(-1*plsiz-4,a1)    ; plane 2
  477.         move.l    (a3),(-2*plsiz-4,a1)    ; plane 1
  478.         move.l    -(a3),(-3*plsiz-4,a1)    ; plane 0
  479.     else
  480.     iflt 2*plsiz-4-32768            ; a1 points into plane 1
  481.         move.l    (a3),(a1)+        ; plane 1
  482.         adda.l    #4*plsiz,a1
  483.         move.l    (a6),(2*plsiz-4,a1)    ; plane 7
  484.         move.l    -(a6),(1*plsiz-4,a1)    ; plane 6
  485.         move.l    (a5),(0*plsiz-4,a1)    ; plane 5
  486.         move.l    -(a5),(-1*plsiz-4,a1)    ; plane 4
  487.         suba.l    #4*plsiz,a1
  488.         move.l    (a4),(2*plsiz-4,a1)    ; plane 3
  489.         move.l    -(a4),(1*plsiz-4,a1)    ; plane 2
  490.         move.l    -(a3),(-1*plsiz-4,a1)    ; plane 0
  491.     else
  492.     iflt plsiz-32768            ; a1 points into plane 0
  493.         adda.l    #6*plsiz,a1
  494.         move.l    (a6),(plsiz,a1)        ; plane 7
  495.         move.l    -(a6),(a1)        ; plane 6
  496.         move.l    (a5),(-plsiz,a1)    ; plane 5
  497.         suba.l    #3*plsiz,a1
  498.         move.l    -(a5),(plsiz,a1)    ; plane 4
  499.         move.l    (a4),(a1)        ; plane 3
  500.         move.l    -(a4),(-plsiz,a1)    ; plane 2
  501.         suba.l    #3*plsiz,a1
  502.         move.l    (a3),(plsiz,a1)        ; plane 1
  503.         move.l    -(a3),(a1)+        ; plane 0
  504.     else
  505.         move.l    #plsiz,d0        ; a1 points into plane 0
  506.         adda.l    #7*plsiz,a1
  507.         move.l    (a6),(a1)        ; plane 7
  508.         suba.l    d0,a1
  509.         move.l    -(a6),(a1)        ; plane 6
  510.         suba.l    d0,a1
  511.         move.l    (a5),(a1)        ; plane 5
  512.         suba.l    d0,a1
  513.         move.l    -(a5),(a1)        ; plane 4
  514.         suba.l    d0,a1
  515.         move.l    (a4),(a1)        ; plane 3
  516.         suba.l    d0,a1
  517.         move.l    -(a4),(a1)        ; plane 2
  518.         suba.l    d0,a1
  519.         move.l    (a3),(a1)        ; plane 1
  520.         suba.l    d0,a1
  521.         move.l    -(a3),(a1)+        ; plane 0
  522.     endc
  523.     endc
  524.     endc
  525.  
  526. ; check if finished, go back for more
  527.  
  528.         sub.w    #1,(sp)
  529.         bne.w    mainloop
  530.  
  531. ; all done!  restore stack and return
  532.  
  533.         addq.w    #2,sp            ; remove outer loop counter
  534.         adda.w    (sp)+,sp        ; remove aligned 32-byte buffer
  535.         movem.l    (sp)+,d2-d7/a2-a6
  536.  
  537.         rts
  538.  
  539. ;-----------------------------------------------------------------------------
  540.  
  541.         end
  542.  
  543.                             O /
  544. ------CUT-OUT----------------X-----------------------------------------------
  545.                             O \
  546.  
  547. ; Chunky2Planar algorithm.
  548. ;
  549. ;     Cpu only solution VERSION 2
  550. ;    Optimised for 040+fastram
  551. ;    analyse instruction offsets to check performance
  552.  
  553.     output    five_pass.o
  554.     opt    l+    ;Linkable code
  555.     opt    c+    ;Case sensitive
  556.     opt    d-    ;No debugging information
  557.     opt    m+    ;Expand macros in listing
  558.     opt    o-    ;No optimisation
  559.  
  560. ;quad_begin:
  561. ;    cnop    0,16
  562.  
  563.     xdef    _chunky2planar
  564.  
  565. ;  a0 -> chunky pixels
  566. ;  a1 -> plane0
  567.  
  568. width        equ    320        ; must be multiple of 32
  569. height        equ    200
  570. plsiz        equ    (width/8)*height
  571.  
  572.  
  573. merge    MACRO in1,in2,tmp3,tmp4,mask,shift
  574.     ;        \1 = abqr
  575.     ;        \2 = ijyz
  576.     move.l    \2,\4
  577.     move.l    #\5,\3
  578.     and.l    \3,\2    \2 = 0j0z
  579.     and.l    \1,\3    \3 = 0b0r
  580.     eor.l    \3,\1    \1 = a0q0
  581.     eor.l    \2,\4    \4 = i0y0
  582.     IFEQ    \6-1
  583.     add.l    \3,\3
  584.     ELSE
  585.     lsl.l    #\6,\3    \3 = b0r0
  586.     ENDC
  587.     lsr.l    #\6,\4    \4 = 0i0y
  588.     or.l    \3,\2    \2 = bjrz
  589.     or.l    \4,\1    \1 = aiqy
  590.     ENDM
  591.  
  592.  
  593. _chunky2planar:
  594.     jmp    next
  595. next
  596.     ; round down address of c2p
  597.     lea    c2p(pc),a0
  598.     move.l    a0,d0
  599.     and.b    #%11110000,d0
  600.     move.l    d0,a1
  601.     
  602.     ; patch jmp
  603.     move.l    d0,_chunky2planar+2
  604.     move.w    #(end-c2p)-1,d0
  605. loop    move.b    (a0)+,(a1)+
  606.     dbra    d0,loop
  607.  
  608.     ;tidy cache
  609.     movem.l    d2-d7/a2-a6,-(sp)    
  610.     move.l    $4.w,a6
  611.     jsr    -636(a6)
  612.     movem.l    (sp)+,d2-d7/a2-a6
  613.     rts
  614.     
  615.     cnop    0,16
  616. c2p:
  617.         movem.l    d2-d7/a2-a6,-(sp)
  618.  
  619.         ; a0 = chunky buffer
  620.         ; a1 = output area
  621.         
  622.         lea    4*plsiz(a1),a1    ; a1 -> plane4
  623.         
  624.         move.l    a0,d0
  625.         add.l    #16,d0
  626.         and.b    #%11110000,d0
  627.         move.l    d0,a0
  628.         
  629.         move.l    a0,a2
  630.         add.l    #8*plsiz,a2
  631.  
  632.         lea    p0(pc),a3        
  633.         bra.s    mainloop
  634.  
  635.     cnop    0,16
  636. mainloop:
  637.     move.l    0(a0),d0
  638.      move.l    4(a0),d2
  639.      move.l    8(a0),d1
  640.     move.l    12(a0),d3
  641.     move.l    2(a0),d4
  642.      move.l    10(a0),d5
  643.     move.l    6(a0),d6
  644.     move.l    14(a0),d7
  645.  
  646.      move.w    16(a0),d0
  647.      move.w    24(a0),d1
  648.     move.w    20(a0),d2
  649.     move.w    28(a0),d3
  650.      move.w    18(a0),d4
  651.      move.w    26(a0),d5
  652.     move.w    22(a0),d6
  653.     move.w    30(a0),d7
  654.     
  655.     adda.w    #32,a0
  656.     move.l    d6,a5
  657.     move.l    d7,a6
  658.  
  659.     merge    d0,d1,d6,d7,$00FF00FF,8
  660.     merge    d2,d3,d6,d7,$00FF00FF,8
  661.  
  662.     merge    d0,d2,d6,d7,$0F0F0F0F,4    
  663.     merge    d1,d3,d6,d7,$0F0F0F0F,4
  664.  
  665.     exg.l    d0,a5
  666.     exg.l    d1,a6    
  667.     
  668.     merge    d4,d5,d6,d7,$00FF00FF,8
  669.     merge    d0,d1,d6,d7,$00FF00FF,8
  670.     
  671.     merge    d4,d0,d6,d7,$0F0F0F0F,4
  672.     merge    d5,d1,d6,d7,$0F0F0F0F,4
  673.  
  674.     merge    d2,d0,d6,d7,$33333333,2
  675.     merge    d3,d1,d6,d7,$33333333,2    
  676.  
  677.     merge    d2,d3,d6,d7,$55555555,1
  678.     merge    d0,d1,d6,d7,$55555555,1
  679.     move.l    d3,2*4(a3)    ;plane2
  680.     move.l    d2,3*4(a3)    ;plane3
  681.     move.l    d1,0*4(a3)    ;plane0
  682.     move.l    d0,1*4(a3)    ;plane1
  683.  
  684.     move.l    a5,d2
  685.     move.l    a6,d3
  686.  
  687.     merge    d2,d4,d6,d7,$33333333,2
  688.     merge    d3,d5,d6,d7,$33333333,2
  689.  
  690.     merge    d2,d3,d6,d7,$55555555,1
  691.     merge    d4,d5,d6,d7,$55555555,1
  692.     move.l    d3,6*4(a3)        ;bitplane6
  693.     move.l    d2,7*4(a3)        ;bitplane7
  694.     move.l    d5,4*4(a3)        ;bitplane4
  695.     move.l    d4,5*4(a3)        ;bitplane5
  696.  
  697.  
  698. inner:
  699.     move.l    0(a0),d0
  700.      move.l    4(a0),d2
  701.      move.l    8(a0),d1
  702.     move.l    12(a0),d3
  703.     move.l    2(a0),d4
  704.      move.l    10(a0),d5
  705.     move.l    6(a0),d6
  706.     move.l    14(a0),d7
  707.  
  708.      move.w    16(a0),d0
  709.      move.w    24(a0),d1
  710.     move.w    20(a0),d2
  711.     move.w    28(a0),d3
  712.      move.w    18(a0),d4
  713.      move.w    26(a0),d5
  714.     move.w    22(a0),d6
  715.     move.w    30(a0),d7
  716.     
  717.     adda.w    #32,a0
  718.     move.l    d6,a5
  719.     move.l    d7,a6
  720.  
  721.     ; write    bitplane 7    
  722.  
  723.     move.l    2*4(a3),-2*plsiz(a1)    ;plane2
  724.     merge    d0,d1,d6,d7,$00FF00FF,8
  725.     merge    d2,d3,d6,d7,$00FF00FF,8
  726.  
  727.     ; write    
  728.     move.l    3*4(a3),-plsiz(a1)    ;plane3
  729.     merge    d0,d2,d6,d7,$0F0F0F0F,4    
  730.     merge    d1,d3,d6,d7,$0F0F0F0F,4
  731.  
  732.     exg.l    d0,a5
  733.     exg.l    d1,a6    
  734.     
  735.     ; write
  736.     move.l    0*4(a3),-4*plsiz(a1)    ;plane0
  737.     merge    d4,d5,d6,d7,$00FF00FF,8
  738.     merge    d0,d1,d6,d7,$00FF00FF,8
  739.     
  740.     ; write    
  741.     move.l    1*4(a3),-3*plsiz(a1) ;plane1
  742.     merge    d4,d0,d6,d7,$0F0F0F0F,4
  743.     merge    d5,d1,d6,d7,$0F0F0F0F,4
  744.  
  745.     ; write    
  746.     move.l    6*4(a3),2*plsiz(a1)    ;bitplane6
  747.     merge    d2,d0,d6,d7,$33333333,2
  748.     merge    d3,d1,d6,d7,$33333333,2    
  749.  
  750.     ; write
  751.     move.l    7*4(a3),3*plsiz(a1)    ;bitplane7
  752.     merge    d2,d3,d6,d7,$55555555,1
  753.     merge    d0,d1,d6,d7,$55555555,1
  754.     move.l    d3,2*4(a3)    ;plane2
  755.     move.l    d2,3*4(a3)    ;plane3
  756.     move.l    d1,0*4(a3)    ;plane0
  757.     move.l    d0,1*4(a3)    ;plane1
  758.  
  759.     move.l    a5,d2
  760.     move.l    a6,d3
  761.  
  762.     move.l    4*4(a3),(a1)+        ;bitplane4    
  763.     merge    d2,d4,d6,d7,$33333333,2
  764.     merge    d3,d5,d6,d7,$33333333,2
  765.  
  766.     move.l    5*4(a3),-4+1*plsiz(a1)    ;bitplane5
  767.     merge    d2,d3,d6,d7,$55555555,1
  768.     merge    d4,d5,d6,d7,$55555555,1
  769.     move.l    d3,6*4(a3)        ;bitplane6
  770.     move.l    d2,7*4(a3)        ;bitplane7
  771.     move.l    d5,4*4(a3)        ;bitplane4
  772.     move.l    d4,5*4(a3)        ;bitplane5
  773.  
  774.     cmpa.l    a0,a2
  775.     bne.w    inner
  776.  
  777.     move.l    2*4(a3),-2*plsiz(a1)    ;plane2
  778.     move.l    3*4(a3),-plsiz(a1)    ;plane3
  779.     move.l    0*4(a3),-4*plsiz(a1)    ;plane0
  780.     move.l    1*4(a3),-3*plsiz(a1)     ;plane1
  781.     move.l    6*4(a3),2*plsiz(a1)    ;bitplane6
  782.     move.l    7*4(a3),3*plsiz(a1)    ;bitplane7
  783.     move.l    4*4(a3),(a1)+        ;bitplane4    
  784.     move.l    5*4(a3),-4+1*plsiz(a1)    ;bitplane5
  785.  
  786. exit
  787.     movem.l    (sp)+,d2-d7/a2-a6
  788.     rts
  789.  
  790.     cnop    0,4
  791. end:
  792. p0    dc.l    0
  793. p1    dc.l    0
  794. p2    dc.l    0
  795. p3    dc.l    0
  796. p4    dc.l    0
  797. p5    dc.l    0
  798. p6    dc.l    0
  799. p7    dc.l    0
  800.  
  801.                             O /
  802. ------CUT-OUT----------------X-----------------------------------------------
  803.                             O \
  804.  
  805. ; Chunky2Planar algorithm. [writes pipelined a little]
  806. ;
  807. ;     Cpu only solution
  808. ;    Optimised for 020+fastram
  809. ;    Aim for less than 90ms for 320x200x256 on 14MHz 020
  810.  
  811.     output    five_pass.o
  812.     opt    l+    ;Linkable code
  813.     opt    c+    ;Case sensitive
  814.     opt    d-    ;No debugging information
  815.     opt    m+    ;Expand macros in listing
  816.     opt    o-    ;No optimisation
  817.     
  818.     xdef    _chunky2planar
  819.         
  820. ;  a0 -> chunky pixels
  821. ;  a1 -> plane0
  822.  
  823. width        equ    320        ; must be multiple of 32
  824. height        equ    200
  825. plsiz        equ    (width/8)*height
  826.  
  827.         _chunky2planar:
  828.         ;a0 = chunky buffer
  829.         ;a1 = first bitplane
  830.         
  831.     movem.l    d2-d7/a2-a6,-(sp)
  832.     move.l    a0,a2
  833.     add.l    #plsiz*8,a2    ;a2 = end of chunky buffer
  834.     
  835.     ;; Sweep thru the whole chunky data once,
  836.     ;; Performing 3 merge operations on it.
  837.     
  838.     move.l    #$00ff00ff,a3    ; load byte merge mask
  839.     move.l    #$0f0f0f0f,a4    ; load nibble merge mask
  840.     
  841. firstsweep
  842.      movem.l (a0),d0-d7      ;8+4n   40      cycles
  843.      move.l  d4,a6           a6 = CD
  844.      move.w  d0,d4           d4 = CB
  845.      swap    d4              d4 = BC
  846.      move.w  d4,d0           d0 = AC
  847.      move.w  a6,d4           d4 = BD
  848.      move.l  d5,a6           a6 = CD
  849.      move.w  d1,d5           d5 = CB
  850.      swap    d5              d5 = BC
  851.      move.w  d5,d1           d1 = AC
  852.      move.w  a6,d5           d5 = BD
  853.      move.l  d6,a6           a6 = CD
  854.      move.w  d2,d6           d6 = CB
  855.      swap    d6              d6 = BC
  856.      move.w  d6,d2           d2 = AC
  857.      move.w  a6,d6           d6 = BD
  858.      move.l  d7,a6           a6 = CD
  859.      move.w  d3,d7           d7 = CB
  860.      swap    d7              d7 = BC
  861.      move.w  d7,d3           d3 = AC
  862.      move.w  a6,d7           d7 = BD
  863.      move.l  d7,a6
  864.      move.l  d6,a5
  865.      move.l  a3,d6   ; d6 = 0x0x
  866.      move.l  a3,d7   ; d7 = 0x0x
  867.      and.l   d0,d6   ; d6 = 0b0r
  868.      and.l   d2,d7   ; d7 = 0j0z
  869.      eor.l   d6,d0   ; d0 = a0q0
  870.      eor.l   d7,d2   ; d2 = i0y0
  871.      lsl.l   #8,d6   ; d6 = b0r0
  872.      lsr.l   #8,d2   ; d2 = 0i0y
  873.      or.l    d2,d0           ; d0 = aiqy
  874.      or.l    d7,d6           ; d2 = bjrz
  875.      move.l  a3,d7   ; d7 = 0x0x
  876.      move.l  a3,d2   ; d2 = 0x0x
  877.      and.l   d1,d7   ; d7 = 0b0r
  878.      and.l   d3,d2   ; d2 = 0j0z
  879.      eor.l   d7,d1   ; d1 = a0q0
  880.      eor.l   d2,d3   ; d3 = i0y0
  881.      lsl.l   #8,d7   ; d7 = b0r0
  882.      lsr.l   #8,d3   ; d3 = 0i0y
  883.      or.l    d3,d1           ; d1 = aiqy
  884.      or.l    d2,d7           ; d3 = bjrz
  885.  
  886.      move.l  a4,d2   ; d2 = 0x0x
  887.      move.l  a4,d3   ; d3 = 0x0x
  888.      and.l   d0,d2   ; d2 = 0b0r
  889.      and.l   d1,d3   ; d3 = 0j0z
  890.      eor.l   d2,d0   ; d0 = a0q0
  891.      eor.l   d3,d1   ; d1 = i0y0
  892.      lsr.l   #4,d1   ; d1 = 0i0y
  893.      or.l    d1,d0           ; d0 = aiqy
  894.      move.l  d0,(a0)+
  895.      lsl.l    #4,d2
  896.      or.l    d3,d2           ; d1 = bjrz
  897.      move.l    d2,(a0)+
  898.     
  899.      move.l  a4,d3   ; d3 = 0x0x
  900.      move.l  a4,d1   ; d1 = 0x0x
  901.      and.l   d6,d3   ; d3 = 0b0r
  902.      and.l   d7,d1   ; d1 = 0j0z
  903.      eor.l   d3,d6   ; d6 = a0q0
  904.      eor.l   d1,d7   ; d7 = i0y0
  905.      lsr.l   #4,d7   ; d7 = 0i0y
  906.      or.l    d7,d6           ; d6 = aiqy
  907.      move.l    d6,(a0)+
  908.      lsl.l    #4,d3
  909.      or.l    d1,d3           ; d7 = bjrz
  910.      move.l    d3,(a0)+
  911.     
  912. ;     move.l  d0,(a0)+
  913. ;     move.l  d2,(a0)+
  914. ;     move.l  d6,(a0)+
  915. ;     move.l  d3,(a0)+
  916.      move.l  a6,d7
  917.      move.l  a5,d6
  918.      move.l  a3,d0   ; d0 = 0x0x
  919.      move.l  a3,d1   ; d1 = 0x0x
  920.      and.l   d4,d0   ; d0 = 0b0r
  921.      and.l   d6,d1   ; d1 = 0j0z
  922.      eor.l   d0,d4   ; d4 = a0q0
  923.      eor.l   d1,d6   ; d6 = i0y0
  924.      lsl.l   #8,d0   ; d0 = b0r0
  925.      lsr.l   #8,d6   ; d6 = 0i0y
  926.      or.l    d6,d4           ; d4 = aiqy
  927.      or.l    d1,d0           ; d6 = bjrz
  928.      move.l  a3,d1   ; d1 = 0x0x
  929.      move.l  a3,d6   ; d6 = 0x0x
  930.      and.l   d5,d1   ; d1 = 0b0r
  931.      and.l   d7,d6   ; d6 = 0j0z
  932.      eor.l   d1,d5   ; d5 = a0q0
  933.      eor.l   d6,d7   ; d7 = i0y0
  934.      lsl.l   #8,d1   ; d1 = b0r0
  935.      lsr.l   #8,d7   ; d7 = 0i0y
  936.      or.l    d7,d5           ; d5 = aiqy
  937.      or.l    d6,d1           ; d7 = bjrz
  938.      move.l  a4,d6   ; d6 = 0x0x
  939.      move.l  a4,d7   ; d7 = 0x0x
  940.      and.l   d4,d6   ; d6 = 0b0r
  941.      and.l   d5,d7   ; d7 = 0j0z
  942.      eor.l   d6,d4   ; d4 = a0q0
  943.      eor.l   d7,d5   ; d5 = i0y0
  944.      lsr.l   #4,d5   ; d5 = 0i0y
  945.      or.l    d5,d4           ; d4 = aiqy
  946.      move.l  d4,(a0)+
  947.      lsl.l   #4,d6   ; d6 = b0r0
  948.      or.l    d7,d6           ; d5 = bjrz
  949.      move.l  d6,(a0)+
  950.     
  951.      move.l  a4,d7   ; d7 = 0x0x
  952.      move.l  a4,d5   ; d5 = 0x0x
  953.      and.l   d0,d7   ; d7 = 0b0r
  954.      and.l   d1,d5   ; d5 = 0j0z
  955.      eor.l   d7,d0   ; d0 = a0q0
  956.      eor.l   d5,d1   ; d1 = i0y0
  957.      lsr.l   #4,d1   ; d1 = 0i0y
  958.      or.l    d1,d0           ; d0 = aiqy
  959.      move.l  d0,(a0)+
  960.      lsl.l   #4,d7   ; d7 = b0r0
  961.      or.l    d5,d7           ; d1 = bjrz
  962.      move.l  d7,(a0)+
  963.      cmp.l   a0,a2           ;; 4c
  964.      bne.w   firstsweep      ;; 6c
  965.     
  966.      sub.l   #plsiz*8,a0
  967.      move.l  #$33333333,a5
  968.      move.l  #$55555555,a6
  969.      lea     plsiz*4(a1),a1  ;a2 = plane4
  970.     
  971. secondsweep
  972.      move.l  (a0),d0
  973.      move.l  8(a0),d1
  974.      move.l  16(a0),d2
  975.      move.l  24(a0),d3
  976.     
  977.      move.l  a5,d6   ; d6 = 0x0x
  978.      move.l  a5,d7   ; d7 = 0x0x
  979.      and.l   d0,d6   ; d6 = 0b0r
  980.      and.l   d2,d7   ; d7 = 0j0z
  981.      eor.l   d6,d0   ; d0 = a0q0
  982.      eor.l   d7,d2   ; d2 = i0y0
  983.      lsl.l   #2,d6   ; d6 = b0r0
  984.      lsr.l   #2,d2   ; d2 = 0i0y
  985.      or.l    d2,d0           ; d0 = aiqy
  986.      or.l    d7,d6           ; d2 = bjrz
  987.      move.l  a5,d7   ; d7 = 0x0x
  988.      move.l  a5,d2   ; d2 = 0x0x
  989.      and.l   d1,d7   ; d7 = 0b0r
  990.      and.l   d3,d2   ; d2 = 0j0z
  991.      eor.l   d7,d1   ; d1 = a0q0
  992.      eor.l   d2,d3   ; d3 = i0y0
  993.      lsl.l   #2,d7   ; d7 = b0r0
  994.      lsr.l   #2,d3   ; d3 = 0i0y
  995.      or.l    d3,d1           ; d1 = aiqy
  996.      or.l    d2,d7           ; d3 = bjrz
  997.      move.l  a6,d2   ; d2 = 0x0x
  998.      move.l  a6,d3   ; d3 = 0x0x
  999.      and.l   d0,d2   ; d2 = 0b0r
  1000.      and.l   d1,d3   ; d3 = 0j0z
  1001.      eor.l   d2,d0   ; d0 = a0q0
  1002.      eor.l   d3,d1   ; d1 = i0y0
  1003.      lsr.l   #1,d1   ; d1 = 0i0y
  1004.      or.l    d1,d0           ; d0 = aiqy
  1005.      move.l  d0,plsiz*3(a1)
  1006.      add.l   d2,d2
  1007.      or.l    d3,d2           ; d1 = bjrz
  1008.      move.l  d2,plsiz*2(a1)
  1009.  
  1010.      move.l  a6,d3   ; d3 = 0x0x
  1011.      move.l  a6,d1   ; d1 = 0x0x
  1012.      and.l   d6,d3   ; d3 = 0b0r
  1013.      and.l   d7,d1   ; d1 = 0j0z
  1014.      eor.l   d3,d6   ; d6 = a0q0
  1015.      eor.l   d1,d7   ; d7 = i0y0
  1016.      lsr.l   #1,d7   ; d7 = 0i0y
  1017.      or.l    d7,d6           ; d6 = aiqy
  1018.      move.l  d6,plsiz*1(a1)
  1019.      add.l   d3,d3
  1020.      or.l    d1,d3           ; d7 = bjrz
  1021.      move.l  d3,(a1)+
  1022.      
  1023.      move.l  4(a0),d0
  1024.      move.l  12(a0),d1
  1025.      move.l  20(a0),d2
  1026.      move.l  28(a0),d3
  1027.     
  1028.      move.l  a5,d6   ; d6 = 0x0x
  1029.      move.l  a5,d7   ; d7 = 0x0x
  1030.      and.l   d0,d6   ; d6 = 0b0r
  1031.      and.l   d2,d7   ; d7 = 0j0z
  1032.      eor.l   d6,d0   ; d0 = a0q0
  1033.      eor.l   d7,d2   ; d2 = i0y0
  1034.      lsl.l   #2,d6   ; d6 = b0r0
  1035.      lsr.l   #2,d2   ; d2 = 0i0y
  1036.      or.l    d2,d0           ; d0 = aiqy
  1037.      or.l    d7,d6           ; d2 = bjrz
  1038.      move.l  a5,d7   ; d7 = 0x0x
  1039.      move.l  a5,d2   ; d2 = 0x0x
  1040.      and.l   d1,d7   ; d7 = 0b0r
  1041.      and.l   d3,d2   ; d2 = 0j0z
  1042.      eor.l   d7,d1   ; d1 = a0q0
  1043.      eor.l   d2,d3   ; d3 = i0y0
  1044.      lsl.l   #2,d7   ; d7 = b0r0
  1045.      lsr.l   #2,d3   ; d3 = 0i0y
  1046.      or.l    d3,d1           ; d1 = aiqy
  1047.      or.l    d2,d7           ; d3 = bjrz
  1048.      move.l  a6,d2   ; d2 = 0x0x
  1049.      move.l  a6,d3   ; d3 = 0x0x
  1050.      and.l   d0,d2   ; d2 = 0b0r
  1051.      and.l   d1,d3   ; d3 = 0j0z
  1052.      eor.l   d2,d0   ; d0 = a0q0
  1053.      eor.l   d3,d1   ; d1 = i0y0
  1054.      lsr.l   #1,d1   ; d1 = 0i0y
  1055.      or.l    d1,d0           ; d0 = aiqy
  1056.      move.l  d0,-4-plsiz*1(a1)
  1057.      add.l   d2,d2
  1058.      or.l    d3,d2           ; d1 = bjrz
  1059.      move.l  d2,-4-plsiz*2(a1)
  1060.  
  1061.      move.l  a6,d3   ; d3 = 0x0x
  1062.      move.l  a6,d1   ; d1 = 0x0x
  1063.      and.l   d6,d3   ; d3 = 0b0r
  1064.      and.l   d7,d1   ; d1 = 0j0z
  1065.      eor.l   d3,d6   ; d6 = a0q0
  1066.      eor.l   d1,d7   ; d7 = i0y0
  1067.      lsr.l   #1,d7   ; d7 = 0i0y
  1068.      or.l    d7,d6           ; d6 = aiqy
  1069.      move.l  d6,-4-plsiz*3(a1)
  1070.      add.l   d3,d3
  1071.      or.l    d1,d3           ; d7 = bjrz
  1072.      move.l  d3,-4-plsiz*4(a1)
  1073.      add.w   #32,a0  ;;4c
  1074.      cmp.l   a0,a2   ;;4c
  1075.      bne.w   secondsweep     ;;6c
  1076.     
  1077.     ;300
  1078.     
  1079. exit    
  1080.     movem.l    (sp)+,d2-d7/a2-a6
  1081.     rts
  1082.     
  1083.                             O /
  1084. ------CUT-OUT----------------X-----------------------------------------------
  1085.                             O \
  1086.  
  1087. ; Chunky2Planar algorithm.
  1088. ;
  1089. ;     Cpu only solution
  1090. ;    Optimised for 020+fastram
  1091. ;    Aim for less than 90ms for 320x200x256 on 14MHz 020
  1092.  
  1093.     output    five_pass.o
  1094.     opt    l+    ;Linkable code
  1095.     opt    c+    ;Case sensitive
  1096.     opt    d-    ;No debugging information
  1097.     opt    m+    ;Expand macros in listing
  1098.     opt    o-    ;No optimisation
  1099.     
  1100.     xdef    _chunky2planar
  1101.         
  1102. ;  a0 -> chunky pixels
  1103. ;  a1 -> plane0
  1104.  
  1105. width        equ    320        ; must be multiple of 32
  1106. height        equ    200
  1107. plsiz        equ    (width/8)*height
  1108.  
  1109. wordmerge    macro
  1110.     ; i1    i2    tmp
  1111.     ; \1    \2    \3
  1112. ;; speedup            \1 AB \2 CD
  1113.     move.l    \2,\3        \3 = CD
  1114.     move.w    \1,\2        \2 = CB
  1115.     swap    \2        \2 = BC
  1116.     move.w    \2,\1        \1 = AC
  1117.     move.w    \3,\2        \2 = BD
  1118.     endm
  1119.  
  1120.         
  1121. merge    macro    ;    i1    i2    t3    t4    m    s
  1122.         ;    \1    \2    \3    \4    \5    \6
  1123.         ;    output as \1,\3
  1124.             ; \1 = abqr
  1125.             ; \2 = ijyz
  1126.     move.l    \5,\3    ; \3 = 0x0x
  1127.     move.l    \5,\4    ; \4 = 0x0x
  1128.     and.l    \1,\3    ; \3 = 0b0r
  1129.     and.l    \2,\4    ; \4 = 0j0z
  1130.     eor.l    \3,\1    ; \1 = a0q0
  1131.     eor.l    \4,\2    ; \2 = i0y0
  1132.     IFEQ    \6-1
  1133.     add.l    \3,\3
  1134.     ELSE
  1135.     lsl.l    #\6,\3    ; \3 = b0r0
  1136.     ENDC
  1137.     lsr.l    #\6,\2    ; \2 = 0i0y
  1138.     or.l    \2,\1        ; \1 = aiqy
  1139.     or.l    \4,\3        ; \2 = bjrz
  1140.     endm
  1141.         
  1142. _chunky2planar:
  1143.         ;a0 = chunky buffer
  1144.         ;a1 = first bitplane
  1145.         
  1146.     movem.l    d2-d7/a2-a6,-(sp)
  1147.     move.l    a0,a2
  1148.     add.l    #plsiz*8,a2    ;a2 = end of chunky buffer
  1149.     
  1150.     ;; Sweep thru the whole chunky data once,
  1151.     ;; Performing 3 merge operations on it.
  1152.     
  1153.     move.l    #$00ff00ff,a3    ; load byte merge mask
  1154.     move.l    #$0f0f0f0f,a4    ; load nibble merge mask
  1155.     
  1156. firstsweep
  1157.  
  1158.     ; pass 1
  1159.     movem.l    (a0),d0-d7    ;8+4n     40    cycles
  1160.     ; d0-7 = abcd efgh ijkl mnop qrst uvwx yzAB CDEF
  1161.     ;; 40c
  1162.     
  1163.     wordmerge    d0,d4,a6    ;d0/4 = abqr cdst
  1164.     wordmerge    d1,d5,a6    ;d1/5 = efuv ghwx
  1165.     wordmerge    d2,d6,a6    ;d2/6 = ijyz klAB
  1166.     wordmerge    d3,d7,a6     ;d3/7 = mnCD opEF
  1167.     ;; 4*14c
  1168.  
  1169.     ; save off a bit of shit
  1170.     move.l    d7,a6
  1171.     move.l    d6,a5
  1172.     ;; 4c
  1173.         
  1174.     ; pass 2
  1175.     merge    d0,d2,d6,d7,a3,8    ;d0/d6 = aiqy bjrz
  1176.     merge    d1,d3,d7,d2,a3,8    ;d1/d7 = emuc fnvD
  1177.     ;; 2*24
  1178.     
  1179.     ; pass 3
  1180.     merge    d0,d1,d2,d3,a4,4    ;d0/d2  = ae74... ae30...
  1181.     merge    d6,d7,d3,d1,a4,4    ;d6/d3  = bf74... bf30...
  1182.     ;; 2*24
  1183.     
  1184.     move.l    d0,(a0)+
  1185.     move.l    d2,(a0)+
  1186.     move.l    d6,(a0)+
  1187.     move.l    d3,(a0)+
  1188.     ;; 4*4c
  1189.     
  1190.     ; bring it back
  1191.     move.l    a6,d7
  1192.     move.l    a5,d6
  1193.     ;; 2*2c
  1194.         
  1195.     ; pass 2
  1196.     merge    d4,d6,d0,d1,a3,8    ;d4/d0 = cksA dltB
  1197.     merge    d5,d7,d1,d6,a3,8    ;d5/d1 = gowE hpxF
  1198.     ;; 2*24c
  1199.     
  1200.     ; pass 3            
  1201.     merge    d4,d5,d6,d7,a4,4    ;d4/d6 = cg74.. cg30..
  1202.     merge    d0,d1,d7,d5,a4,4    ;d0/d7 = dh74.. dh30..
  1203.     ;; 2*24c
  1204.         
  1205.     move.l    d4,(a0)+
  1206.     move.l    d6,(a0)+
  1207.     move.l    d0,(a0)+
  1208.     move.l    d7,(a0)+
  1209.     ;; 4*4c
  1210.     
  1211.     cmp.l    a0,a2        ;; 4c
  1212.     bne.w    firstsweep    ;; 6c
  1213.  
  1214.     ;; 338
  1215.     
  1216.     ; (a0)     ae74.. ae30.. bf74.. bf30.. cg74.. cg30.. dh74.. dh30..
  1217.  
  1218. ;    bra.w    exit
  1219.     
  1220.     sub.l    #plsiz*8,a0
  1221.     move.l    #$33333333,a5
  1222.     move.l    #$55555555,a6
  1223.  
  1224.  
  1225.     lea    plsiz*4(a1),a1    ;a2 = plane4
  1226.     
  1227. secondsweep
  1228.  
  1229.     move.l    (a0),d0
  1230.     move.l    8(a0),d1
  1231.     move.l    16(a0),d2
  1232.     move.l    24(a0),d3
  1233.     ;; 6+3*7
  1234.     
  1235.     ;; pass 4    
  1236.     merge    d0,d2,d6,d7,a5,2    ;d0/d6 = aceg76.. aceg54..
  1237.     merge    d1,d3,d7,d2,a5,2    ;d1/d7 = bdhf76.. bdhf54..
  1238.     ;; 24*2c
  1239.     
  1240.     ;; pass 5    
  1241.     merge    d0,d1,d2,d3,a6,1    ;d0/d2 = abcd7... abcd6...
  1242.     merge    d6,d7,d3,d1,a6,1    ;d6/d3 = abcd5... abcd4...
  1243.     ;; 24*2c
  1244.  
  1245.     move.l    d0,plsiz*3(a1)
  1246.     move.l    d2,plsiz*2(a1)
  1247.     move.l    d6,plsiz*1(a1)
  1248.     move.l    d3,(a1)+
  1249.     ;;3*5+4c
  1250.         
  1251.     move.l    4(a0),d0
  1252.     move.l    12(a0),d1
  1253.     move.l    20(a0),d2
  1254.     move.l    28(a0),d3
  1255.     ;;4*7c
  1256.     ;; pass 4    
  1257.     merge    d0,d2,d6,d7,a5,2    ;d0/d6 = aceg32.. aceg10..
  1258.     merge    d1,d3,d7,d2,a5,2    ;d1/d7 = bdhf32.. bdhf10..
  1259.     ;;2*24
  1260.     ;; pass 5    
  1261.     merge    d0,d1,d2,d3,a6,1    ;d0/d2 = abcd3... abcd2...
  1262.     merge    d6,d7,d3,d1,a6,1    ;d6/d3 = abcd1... abcd0...
  1263.     ;;2*24
  1264.     
  1265.     move.l    d0,-4-plsiz*1(a1)
  1266.     move.l    d2,-4-plsiz*2(a1)
  1267.     move.l    d6,-4-plsiz*3(a1)
  1268.     move.l    d3,-4-plsiz*4(a1)
  1269.     ;;4*5
  1270.     
  1271.     add.w    #32,a0    ;;4c
  1272.     cmp.l    a0,a2    ;;4c
  1273.     bne.w    secondsweep    ;;6c
  1274.  
  1275.     ;300
  1276.     
  1277. exit    
  1278.     movem.l    (sp)+,d2-d7/a2-a6
  1279.     rts
  1280.     
  1281.                             O /
  1282. ------CUT-OUT----------------X-----------------------------------------------
  1283.                             O \
  1284.  
  1285. ;bltcon0     EQU   $040
  1286. ;bltcon1     EQU   $042
  1287. ;bltafwm     EQU   $044
  1288. ;bltalwm     EQU   $046
  1289. bltcpt        EQU   $048
  1290. bltbpt        EQU   $04C
  1291. bltapt        EQU   $050
  1292. bltdpt        EQU   $054
  1293. ;bltsize     EQU   $058
  1294. ;bltcon0l    EQU   $05B        ; note: byte access only
  1295. bltsizv     EQU   $05C
  1296. bltsizh     EQU   $05E
  1297. ;
  1298. ;bltcmod     EQU   $060
  1299. ;bltbmod     EQU   $062
  1300. ;bltamod     EQU   $064
  1301. ;bltdmod     EQU   $066
  1302. ;
  1303. ;bltcdat     EQU   $070
  1304. ;bltbdat     EQU   $072
  1305. ;bltadat     EQU   $074
  1306.  
  1307.  
  1308.     xdef    _BlitterConvert
  1309.  
  1310. ;note: destination bitplanes have to be in this order: 7, 3, 5, 1, 6, 2, 4, 0
  1311. ;      and the chunky buffer must be in chip
  1312. ;      this routine is best used on machines with a slow CPU and chipram only
  1313.  
  1314. ; void __asm BlitterConvert (register __d2 UBYTE *chunky,
  1315. ;                            register __d3 PLANEPTR raster,
  1316. ;                            register __a6 struct GfxBase *GfxBase);
  1317.  
  1318.  
  1319. Width    = 320    ; must be a multiple of 16
  1320. Height    = 200
  1321. Depth    = 8
  1322. BplSize = Width/8*Height
  1323. Size    = Width/8*Height*Depth
  1324. Pixels    = Width*Height
  1325.  
  1326.  
  1327. _BlitterConvert:
  1328.  
  1329.     movem.l    d2-d3/a5,-(sp)
  1330.  
  1331.     jsr    _LVOOwnBlitter(a6)
  1332.     lea    ($dff000),a5
  1333.  
  1334.  
  1335.     ;PASS-1
  1336.  
  1337.     ;subpass1
  1338.     jsr    _LVOWaitBlit(a6)
  1339.  
  1340.     moveq    #-1,d0
  1341.     move.l    d0,bltafwm(a5)
  1342.  
  1343.     move.w    #0,bltdmod(a5)
  1344.  
  1345.     move.l    d2,bltapt(a5)        ; Chunky
  1346.     addq.l    #8,d2
  1347.     move.l    d2,bltbpt(a5)        ; Chunky+8
  1348.  
  1349.     move.l    #Buff1,bltdpt(a5)
  1350.  
  1351.     move.w    #8,bltamod(a5)
  1352.     move.w    #8,bltbmod(a5)
  1353.  
  1354.     move.w    #%1111111100000000,bltcdat(a5)
  1355.     move.l    #$0DE48000,bltcon0(a5)    ;D=AC+Bc [C const]
  1356.  
  1357.     move.w    #Pixels/16,bltsizv(a5)
  1358.     move.w    #4,bltsizh(a5)        ;do blit
  1359.  
  1360.     ;subpass2
  1361.     jsr    _LVOWaitBlit(a6)
  1362.  
  1363.     add.l    #Size-8-2-8,d2
  1364.     move.l    d2,bltapt(a5)        ; Chunky+Size-8-2
  1365.     addq.l    #8,d2
  1366.     move.l    d2,bltbpt(a5)        ; Chunky+Size-2
  1367.  
  1368.     move.l    #Buff1+Size-2,bltdpt(a5)
  1369.  
  1370.     move.l    #$8DE40002,bltcon0(a5)    ;D=AC+Bc [C const], descending mode
  1371.  
  1372.     move.w    #4,bltsizh(a5)        ;do blit
  1373.  
  1374.  
  1375.     ;PASS-2
  1376.  
  1377.     ;subpass1
  1378.     jsr    _LVOWaitBlit(a6)
  1379.  
  1380.     move.l    #Buff1,bltapt(a5)
  1381.     move.l    #Buff1+4,bltbpt(a5)
  1382.  
  1383.     move.l    #Buff2,bltdpt(a5)
  1384.  
  1385.     move.w    #4,bltamod(a5)
  1386.     move.w    #4,bltbmod(a5)
  1387.  
  1388.     move.w    #%1111000011110000,bltcdat(a5)
  1389.     move.l    #$0DE44000,bltcon0(a5)    ;D=AC+Bc [C const]
  1390.  
  1391.     move.w    #Pixels/8,bltsizv(a5)
  1392.     move.w    #2,bltsizh(a5)        ;do blit
  1393.  
  1394.     ;subpass2
  1395.     jsr    _LVOWaitBlit(a6)
  1396.  
  1397.     move.l    #Buff1+Size-2-4,bltapt(a5)
  1398.     move.l    #Buff1+Size-2,bltbpt(a5)
  1399.  
  1400.     move.l    #Buff2+Size-2,bltdpt(a5)
  1401.  
  1402.     move.l    #$4DE40002,bltcon0(a5)    ;D=AC+Bc [C const], descending mode
  1403.  
  1404.     move.w    #2,bltsizh(a5)        ;do blit
  1405.  
  1406.  
  1407.     ;PASS-3
  1408.  
  1409.     ;subpass1
  1410.     jsr    _LVOWaitBlit(a6)
  1411.  
  1412.     move.l    #Buff2,bltapt(a5)
  1413.     move.l    #Buff2+2,bltbpt(a5)
  1414.  
  1415.     move.l    #Buff3,bltdpt(a5)
  1416.  
  1417.     move.w    #2,bltamod(a5)
  1418.     move.w    #2,bltbmod(a5)
  1419.     move.w    #Pixels/4,bltsizv(a5)
  1420.     move.w    #%1100110011001100,bltcdat(a5)
  1421.  
  1422.     move.l    #$0DE42000,bltcon0(a5)    ;D=AC+Bc [C const]
  1423.  
  1424.     move.w    #1,bltsizh(a5)        ;do blit
  1425.  
  1426.     ;subpass2
  1427.     jsr    _LVOWaitBlit(a6)
  1428.  
  1429.     move.l    #Buff2+Size-2-2,bltapt(a5)
  1430.     move.l    #Buff2+Size-2,bltbpt(a5)
  1431.  
  1432.     move.l    #Buff3+Size-2,bltdpt(a5)
  1433.  
  1434.     move.l    #$2DE40002,bltcon0(a5)    ;D=AC+Bc [C const], descending mode
  1435.     move.w    #1,bltsizh(a5)        ;do blit
  1436.  
  1437.  
  1438.     ;PASS-4
  1439.  
  1440.     ;subpass1
  1441.     jsr    _LVOWaitBlit(a6)
  1442.  
  1443.     move.l    #Buff3,bltapt(a5)
  1444.     move.l    #Buff3+1*Size/8,bltbpt(a5)
  1445.  
  1446.     move.l    d3,bltdpt(a5)        ; Planes
  1447.     move.w    #0,bltamod(a5)
  1448.     move.w    #0,bltbmod(a5)
  1449.     move.w    #Size/16,bltsizv(a5)    ;/8???
  1450.     move.w    #%1010101010101010,bltcdat(a5)
  1451.  
  1452.     move.l    #$0DE41000,bltcon0(a5)    ;D=AC+Bc [C const]
  1453.     move.w    #1,bltsizh(a5)        ;do blit
  1454.  
  1455.     jsr    _LVOWaitBlit(a6)
  1456.     move.l    #Buff3+2*Size/8,bltapt(a5)
  1457.     move.l    #Buff3+3*Size/8,bltbpt(a5)
  1458.     move.w    #1,bltsizh(a5)
  1459.  
  1460.     jsr    _LVOWaitBlit(a6)
  1461.     move.l    #Buff3+4*Size/8,bltapt(a5)
  1462.     move.l    #Buff3+5*Size/8,bltbpt(a5)
  1463.     move.w    #1,bltsizh(a5)
  1464.  
  1465.     jsr    _LVOWaitBlit(a6)
  1466.     move.l    #Buff3+6*Size/8,bltapt(a5)
  1467.     move.l    #Buff3+7*Size/8,bltbpt(a5)
  1468.     move.w    #1,bltsizh(a5)
  1469.  
  1470.     ;subpass2
  1471.     jsr    _LVOWaitBlit(a6)
  1472.  
  1473.     move.l    #Buff3+7*Size/8-2,bltapt(a5)
  1474.     move.l    #Buff3+8*Size/8-2,bltbpt(a5)
  1475.  
  1476.     add.l    #Size-2,d3
  1477.     move.l    d3,bltdpt(a5)        ; Planes+Size-2
  1478.  
  1479.     move.l    #$1DE40002,bltcon0(a5)    ;D=AC+Bc [C const], descending mode
  1480.     move.w    #1,bltsizh(a5)        ;do blit
  1481.  
  1482.     jsr    _LVOWaitBlit(a6)
  1483.     move.l    #Buff3+5*Size/8-2,bltapt(a5)
  1484.     move.l    #Buff3+6*Size/8-2,bltbpt(a5)
  1485.     move.w    #1,bltsizh(a5)        
  1486.  
  1487.     jsr    _LVOWaitBlit(a6)
  1488.     move.l    #Buff3+3*Size/8-2,bltapt(a5)
  1489.     move.l    #Buff3+4*Size/8-2,bltbpt(a5)
  1490.     move.w    #1,bltsizh(a5)        
  1491.  
  1492.     jsr    _LVOWaitBlit(a6)
  1493.     move.l    #Buff3+1*Size/8-2,bltapt(a5)
  1494.     move.l    #Buff3+2*Size/8-2,bltbpt(a5)
  1495.     move.w    #1,bltsizh(a5)        
  1496.  
  1497.     jsr    _LVODisownBlitter(a6)
  1498.  
  1499.     movem.l    (sp)+,d2-d3/a5
  1500.  
  1501.     rts
  1502.  
  1503.  
  1504.          SECTION  segment1,BSS,chip        ; MUST BE IN CHIP !!!!!
  1505.  
  1506. ;Chunky  ds.b Size    ;Chunky buffer
  1507. Buff1    ds.b Size     ;Intermediate buffer 1
  1508. Buff2    ds.b Size    ;Intermediate buffer 2
  1509. Buff3    ds.b Size    ;Intermediate buffer 3
  1510.  
  1511. ;Planes    ds.b Size+100    ;Planes as used on screen
  1512. ;L29    =Planes+BplSize
  1513. ;L30    =L29+BplSize
  1514. ;L31    =L30+BplSize
  1515. ;L32    =L31+BplSize
  1516. ;L33    =L32+BplSize
  1517. ;L34    =L33+BplSize
  1518. ;L35    =L34+BplSize
  1519.  
  1520.     END
  1521.  
  1522.                             O /
  1523. ------CUT-OUT----------------X-----------------------------------------------
  1524.                             O \
  1525.  
  1526.         xdef    _chunky2planar
  1527.  
  1528. ; peterm/adaptive.s
  1529. ; Combines peterm/chunky4.s and jmccoull/blitter4pass.s
  1530. ; The blitter works on the top portion of the display at the same time as
  1531. ; the CPU converts the bottom portion.
  1532. ; The blitter has completely finished before the routine returns.
  1533. ; Both parts of every call are timed using the EClock.
  1534. ; The partition point is recalculated at the end of the call in an attempt
  1535. ; to keep the two routines taking about the same amount of time.
  1536. ;
  1537. ; The following formula is used:
  1538. ;
  1539. ;    n_blit = n * t_cpu * n_blit / (t_blit * n_cpu + t_cpu * n_blit)
  1540. ;
  1541. ; where:
  1542. ;    n    is the total number of 32-byte units (i.e, width*height/32)
  1543. ;    n_blit    is the number of 32-byte units above the partition
  1544. ;    n_cpu    is the number of 32-byte units below the partition (=n-n_blit)
  1545. ;    t_blit    is the time taken by the blitter in EClock units
  1546. ;    t_cpu    is the time taken by the cpu in EClock units
  1547. ;
  1548. ; ECS Agnus required (for long blits)
  1549.  
  1550. bltcpt         equ    $048
  1551. bltbpt         equ    $04c
  1552. bltapt         equ    $050
  1553. bltdpt         equ    $054
  1554. bltsizv      equ    $05c
  1555. bltsizh      equ    $05e
  1556. cleanup        equ    $40
  1557. _LVOReadEClock    equ    -60
  1558.  
  1559. ;-----------------------------------------------------------------------------
  1560. ; chunky2planar:    (new Motorola syntax)
  1561. ;  a0 -> chunky pixels (in FAST RAM)
  1562. ;  a1 -> plane0 (assume other 7 planes are allocated contiguously)
  1563. ;  a5 = TimerBase
  1564. ;  a6 = GfxBase
  1565.  
  1566. width        equ    320        ; must be a multiple of 32
  1567. height        equ    200
  1568. pixels        equ    width*height
  1569. plsiz        equ    (width/8)*height
  1570.  
  1571.  
  1572.         section    code,code
  1573.  
  1574. _chunky2planar:    movem.l    d2-d7/a2-a6,-(sp)
  1575.  
  1576. ; save parameters
  1577.  
  1578.         movea.l    #mybltnode,a2
  1579.         move.l    a0,(chunky-mybltnode,a2)
  1580.         move.l    a1,(plane0-mybltnode,a2)
  1581.         move.l    a5,(timerbase-mybltnode,a2)
  1582.         move.l    a6,(gfxbase-mybltnode,a2)
  1583.  
  1584. ; copy pixels_blit from chunky to buff0 (from FAST to CHIP) for the blitter
  1585.  
  1586.         movea.l    (chunky-mybltnode,a2),a0
  1587.         movea.l    #buff0,a1
  1588.         move.l    (pixels_blit-mybltnode,a2),d0
  1589.         movea.l    (4).w,a6
  1590.         jsr    (_LVOCopyMemQuick,a6)
  1591.  
  1592. ; read the start time
  1593.  
  1594.         lea    (starttime-mybltnode,a2),a0
  1595.         movea.l    (timerbase-mybltnode,a2),a6
  1596.         jsr    (_LVOReadEClock,a6)
  1597.  
  1598. ; start the blitter in the background
  1599.  
  1600.         st    (waitflag-mybltnode,a2)
  1601.         movea.l    a2,a1
  1602.         movea.l    (gfxbase-mybltnode,a2),a6
  1603.         jsr    (_LVOQBlit,a6)
  1604.  
  1605. ; compute starting parameters for the CPU routine
  1606.  
  1607.         move.l    #plsiz,d0
  1608.         sub.l    (plsiz_blit-mybltnode,a2),d0
  1609.         lsr.l    #2,d0
  1610.         move.w    d0,-(sp)    ; outer loop counter on stack
  1611.  
  1612.         move.l    (chunky-mybltnode,a2),a0
  1613.         adda.l    (pixels_blit-mybltnode,a2),a0    ; offset into chunky
  1614.  
  1615.         move.l    (plane0-mybltnode,a2),a1
  1616.         adda.l    (plsiz_blit-mybltnode,a2),a1    ; offset into plane
  1617.  
  1618.         lea    (buffers-mybltnode,a2),a3    ; a3 -> buffers
  1619.  
  1620.     iflt 4*plsiz-4-32768
  1621.         adda.w    #3*plsiz,a1    ; a1 -> plane 3
  1622.     else
  1623.     iflt 2*plsiz-4-32768
  1624.         adda.w    #1*plsiz,a1    ; a1 -> plane 1
  1625.     endc
  1626.     endc
  1627.  
  1628. ; set up register constants
  1629.  
  1630.         move.l    #$0f0f0f0f,d5    ; d5 = constant $0f0f0f0f
  1631.         move.l    #$55555555,d6    ; d6 = constant $55555555
  1632.         move.l    #$3333cccc,d7    ; d7 = constant $3333cccc
  1633.         lea    (4,a3),a2    ; used for inner loop end test
  1634.  
  1635. ; load up address registers with buffer ptrs
  1636.  
  1637.         lea    (2*4,a3),a4    ; a4 -> plane2buf
  1638.         lea    (2*4,a4),a5    ; a5 -> plane4buf
  1639.         lea    (2*4,a5),a6    ; a6 -> plane6buf
  1640.  
  1641. ; main loop (starts here) processes 8 chunky pixels at a time
  1642.  
  1643. mainloop:
  1644.  
  1645. ; d0 = a7a6a5a4a3a2a1a0 b7b6b5b4b3b2b1b0 c7c6c5c4c3c2c1c0 d7d6d5d4d3d2d1d0
  1646.  
  1647.         move.l    (a0)+,d0    ; 12 get next 4 chunky pixels in d0
  1648.  
  1649. ; d1 = e7e6e5e4e3e2e1e0 f7f6f5f4f3f2f1f0 g7g6g5g4g3g2g1g0 h7h6h5h4h3h2h1h0
  1650.  
  1651.         move.l    (a0)+,d1    ; 12 get next 4 chunky pixels in d1
  1652.  
  1653. ; d2 = d0 & 0f0f0f0f
  1654. ; d2 = ........a3a2a1a0 ........b3b2b1b0 ........c3c2c1c0 ........d3d2d1d0
  1655.  
  1656.         move.l    d0,d2        ;  4
  1657.         and.l    d5,d2        ;  8 d5=$0f0f0f0f
  1658.  
  1659. ; d0 ^= d2
  1660. ; d0 = a7a6a5a4........ b7b6b5b4........ c7c6c5c4........ d7d6d5d4........
  1661.  
  1662.         eor.l    d2,d0        ;  8
  1663.  
  1664. ; d3 = d1 & 0f0f0f0f
  1665. ; d3 = ........e3e2e1e0 ........f3f2f1f0 ........g3g2g1g0 ........h3h2h1h0
  1666.  
  1667.         move.l    d1,d3        ;  4
  1668.         and.l    d5,d3        ;  8 d5=$0f0f0f0f
  1669.  
  1670. ; d1 ^= d3
  1671. ; d1 = e7e6e5e4........ f7f6f5f4........ g7g6g5g4........ h7h6h5h4........
  1672.  
  1673.         eor.l    d3,d1        ;  8
  1674.  
  1675. ; d2 = (d2 << 4) | d3
  1676. ; d2 = a3a2a1a0e3e2e1e0 b3b2b1b0f3f2f1f0 c3c2c1c0g3g2g1g0 d3d2d1d0h3h2h1h0
  1677.  
  1678.         lsl.l    #4,d2        ; 16
  1679.         or.l    d3,d2        ;  8
  1680.  
  1681. ; d0 = d0 | (d1 >> 4)
  1682. ; d0 = a7a6a5a4e7e6e5e4 b7b6b5b4f7f6f5f4 c7c6c5c4g7g6g5g4 d7d6d5d4h7h6h5h4
  1683.  
  1684.         lsr.l    #4,d1        ; 16
  1685.         or.l    d1,d0        ;  8
  1686.  
  1687. ; d3 = ((d2 & 33330000) << 2) | (swap(d2) & 3333cccc) | ((d2 & 0000cccc) >> 2)
  1688. ; d3 = a1a0c1c0e1e0g1g0 b1b0d1d0f1f0h1h0 a3a2c3c2e3e2g3g2 b3b2d3d2f3f2h3h2
  1689.  
  1690.         move.l    d2,d3        ;  4
  1691.         and.l    d7,d3        ;  8 d7=$3333cccc
  1692.         move.w    d3,d1        ;  4
  1693.         clr.w    d3        ;  4
  1694.         lsl.l    #2,d3        ; 12
  1695.         lsr.w    #2,d1        ; 10
  1696.         or.w    d1,d3        ;  4
  1697.         swap    d2        ;  4
  1698.         and.l    d7,d2        ;  8 d7=$3333cccc
  1699.         or.l    d2,d3        ;  8
  1700.  
  1701. ; d1 = ((d0 & 33330000) << 2) | (swap(d0) & 3333cccc) | ((d0 & 0000cccc) >> 2)
  1702. ; d1 = a5a4c5c4e5e4g5g4 b5b4d5d4f5f4h5h4 a7a6c7c6e7e6g7g6 b7b6d7d6f7f6h7h6
  1703.  
  1704.         move.l    d0,d1        ;  4
  1705.         and.l    d7,d1        ;  8 d7=$3333cccc
  1706.         move.w    d1,d2        ;  4
  1707.         clr.w    d1        ;  4
  1708.         lsl.l    #2,d1        ; 12
  1709.         lsr.w    #2,d2        ; 10
  1710.         or.w    d2,d1        ;  4
  1711.         swap    d0        ;  4
  1712.         and.l    d7,d0        ;  8 d7=$3333cccc
  1713.         or.l    d0,d1        ;  8
  1714.  
  1715. ; d2 = d1 >> 7
  1716. ; d2 = ..............a5 a4c5c4e5e4g5g4b5 b4d5d4f5f4h5h4a7 a6c7c6e7e6g7g6..
  1717.  
  1718.         move.l    d1,d2        ;  4
  1719.         lsr.l    #7,d2        ; 22
  1720.  
  1721. ; d0 = d1 & 55555555
  1722. ; d0 = ..a4..c4..e4..g4 ..b4..d4..f4..h4 ..a6..c6..e6..g6 ..b6..d6..f6..h6
  1723.  
  1724.         move.l    d1,d0        ;  4
  1725.         and.l    d6,d0        ;  8 d6=$55555555
  1726.  
  1727. ; d1 ^= d0
  1728. ; d1 = a5..c5..e5..g5.. b5..d5..f5..h5.. a7..c7..e7..g7.. b7..d7..f7..h7..
  1729.  
  1730.         eor.l    d0,d1        ;  8
  1731.  
  1732. ; d4 = d2 & 55555555
  1733. ; d4 = ..............a5 ..c5..e5..g5..b5 ..d5..f5..h5..a7 ..c7..e7..g7....
  1734.  
  1735.         move.l    d2,d4        ;  4
  1736.         and.l    d6,d4        ;  8 d6=$55555555
  1737.  
  1738. ; d2 ^= d4
  1739. ; d2 = ................ a4..c4..e4..g4.. b4..d4..f4..h4.. a6..c6..e6..g6..
  1740.  
  1741.         eor.l    d4,d2        ;  8
  1742.  
  1743. ; d1 = (d1 | d4) >> 1
  1744. ; d1 = ................ a5b5c5d5e5f5g5h5 ................ a7b7c7d7e7f7g7h7
  1745.  
  1746.         or.l    d4,d1        ;  8
  1747.         lsr.l    #1,d1        ; 10
  1748.  
  1749.         move.b    d1,(4,a6)    ; 12 plane 7
  1750.         swap    d1        ;  4
  1751.         move.b    d1,(4,a5)    ; 12 plane 5
  1752.  
  1753. ; d2 |= d0
  1754. ; d2 = ................ a4b4c4d4e4f4g4h4 ................ a6b6c6d6e6f6g6h6
  1755.  
  1756.         or.l    d0,d2        ;  8
  1757.  
  1758.         move.b    d2,(a6)+    ;  8 plane 6
  1759.         swap    d2        ;  4
  1760.         move.b    d2,(a5)+    ;  8 plane 4
  1761.  
  1762. ; d2 = d3 >> 7
  1763. ; d2 = ..............a1 a0c1c0e1e0g1g0b1 b0d1d0f1f0h1h0a3 a2c3c2e3e2g3g2..
  1764.  
  1765.         move.l    d3,d2        ;  4
  1766.         lsr.l    #7,d2        ; 22
  1767.  
  1768. ; d0 = d3 & 55555555
  1769. ; d0 = ..a0..c0..e0..g0 ..b0..d0..f0..h0 ..a2..c2..e2..g2 ..b2..d2..f2..h2
  1770.  
  1771.         move.l    d3,d0        ;  4
  1772.         and.l    d6,d0        ;  8 d6=$55555555
  1773.  
  1774. ; d3 ^= d0
  1775. ; d3 = a1..c1..e1..g1.. b1..d1..f1..h1.. a3..c3..e3..g3.. b3..d3..f3..h3..
  1776.  
  1777.         eor.l    d0,d3        ;  8
  1778.  
  1779. ; d4 = d2 & 55555555
  1780. ; d4 = ..............a1 ..c1..e1..g1..b1 ..d1..f1..h1..a3 ..c3..e3..g3....
  1781.  
  1782.         move.l    d2,d4        ;  4
  1783.         and.l    d6,d4        ;  8 d6=$55555555
  1784.  
  1785. ; d2 ^= d4
  1786. ; d2 = ................ a0..c0..e0..g0.. b0..d0..f0..h0.. a2..c2..e2..g2..
  1787.  
  1788.         eor.l    d4,d2        ;  8
  1789.  
  1790. ; d3 = (d3 | d4) >> 1
  1791. ; d3 = ................ a1b1c1d1e1f1g1h1 ................ a3b3c3d3e3f3g3h3
  1792.  
  1793.         or.l    d4,d3        ;  8
  1794.         lsr.l    #1,d3        ; 10
  1795.  
  1796.         move.b    d3,(4,a4)    ; 12 plane 3
  1797.         swap    d3        ;  4
  1798.         move.b    d3,(4,a3)    ; 12 plane 1
  1799.  
  1800. ; d2 = d2 | d0
  1801. ; d2 = ................ a0b0c0d0e0f0g0h0 ................ a2b2c2d2e2f2g2h2
  1802.  
  1803.         or.l    d0,d2        ;  8
  1804.  
  1805.         move.b    d2,(a4)+    ;  8 plane 2
  1806.         swap    d2        ;  4
  1807.         move.b    d2,(a3)+    ;  8 plane 0
  1808.  
  1809. ; test if stack buffers are full, loop back if not
  1810.  
  1811.         cmpa.l    a3,a2        ;  6
  1812.         bne.w    mainloop    ; 10    total=540 (67.5 cycles/pixel)
  1813.  
  1814. ; move stack buffers to bitplanes (longword writes) and restore ptrs
  1815.  
  1816.     iflt 4*plsiz-4-32768            ; a1 points into plane 3
  1817.         move.l    (a4),(a1)+        ; plane 3
  1818.         move.l    (a6),(4*plsiz-4,a1)    ; plane 7
  1819.         move.l    -(a6),(3*plsiz-4,a1)    ; plane 6
  1820.         move.l    (a5),(2*plsiz-4,a1)    ; plane 5
  1821.         move.l    -(a5),(1*plsiz-4,a1)    ; plane 4
  1822.         move.l    -(a4),(-1*plsiz-4,a1)    ; plane 2
  1823.         move.l    (a3),(-2*plsiz-4,a1)    ; plane 1
  1824.         move.l    -(a3),(-3*plsiz-4,a1)    ; plane 0
  1825.     else
  1826.     iflt 2*plsiz-4-32768            ; a1 points into plane 1
  1827.         move.l    (a3),(a1)+        ; plane 1
  1828.         adda.l    #4*plsiz,a1
  1829.         move.l    (a6),(2*plsiz-4,a1)    ; plane 7
  1830.         move.l    -(a6),(1*plsiz-4,a1)    ; plane 6
  1831.         move.l    (a5),(0*plsiz-4,a1)    ; plane 5
  1832.         move.l    -(a5),(-1*plsiz-4,a1)    ; plane 4
  1833.         suba.l    #4*plsiz,a1
  1834.         move.l    (a4),(2*plsiz-4,a1)    ; plane 3
  1835.         move.l    -(a4),(1*plsiz-4,a1)    ; plane 2
  1836.         move.l    -(a3),(-1*plsiz-4,a1)    ; plane 0
  1837.     else
  1838.     iflt plsiz-32768            ; a1 points into plane 0
  1839.         adda.l    #6*plsiz,a1
  1840.         move.l    (a6),(plsiz,a1)        ; plane 7
  1841.         move.l    -(a6),(a1)        ; plane 6
  1842.         move.l    (a5),(-plsiz,a1)    ; plane 5
  1843.         suba.l    #3*plsiz,a1
  1844.         move.l    -(a5),(plsiz,a1)    ; plane 4
  1845.         move.l    (a4),(a1)        ; plane 3
  1846.         move.l    -(a4),(-plsiz,a1)    ; plane 2
  1847.         suba.l    #3*plsiz,a1
  1848.         move.l    (a3),(plsiz,a1)        ; plane 1
  1849.         move.l    -(a3),(a1)+        ; plane 0
  1850.     else
  1851.         move.l    #plsiz,d0        ; a1 points into plane 0
  1852.         adda.l    #7*plsiz,a1
  1853.         move.l    (a6),(a1)        ; plane 7
  1854.         suba.l    d0,a1
  1855.         move.l    -(a6),(a1)        ; plane 6
  1856.         suba.l    d0,a1
  1857.         move.l    (a5),(a1)        ; plane 5
  1858.         suba.l    d0,a1
  1859.         move.l    -(a5),(a1)        ; plane 4
  1860.         suba.l    d0,a1
  1861.         move.l    (a4),(a1)        ; plane 3
  1862.         suba.l    d0,a1
  1863.         move.l    -(a4),(a1)        ; plane 2
  1864.         suba.l    d0,a1
  1865.         move.l    (a3),(a1)        ; plane 1
  1866.         suba.l    d0,a1
  1867.         move.l    -(a3),(a1)+        ; plane 0
  1868.     endc
  1869.     endc
  1870.     endc
  1871.  
  1872. ; check if finished, go back for more
  1873.  
  1874.         sub.w    #1,(sp)
  1875.         bne.w    mainloop
  1876.  
  1877. ; CPU all done!  restore stack
  1878.  
  1879.         addq.w    #2,sp            ; remove outer loop counter
  1880.  
  1881. ; find out how long it took
  1882.  
  1883.         lea    (endcputime-buffers,a3),a0
  1884.         movea.l    (timerbase-buffers,a3),a6    ; timerbase
  1885.         jsr    (_LVOReadEClock,a6)
  1886.  
  1887. ; wait for the blitter to finish
  1888. ; busy-wait (for a very short time) on FAST bus, even on a CHIP-only machine
  1889.  
  1890.         movea.l    (gfxbase-buffers,a3),a6
  1891.         bra.b    endwaitloop
  1892. waitloop:    jsr    (_LVOWaitBlit,a6)
  1893. endwaitloop:    tst.b    (waitflag-buffers,a3)
  1894.         bne.b    waitloop
  1895.  
  1896. ; get blittime,cputime,n_blit in d2,d3,d0
  1897.  
  1898.         move.l    (endblittime+4-buffers,a3),d2
  1899.         sub.l    (starttime+4-buffers,a3),d2
  1900.  
  1901.         move.l    (endcputime+4-buffers,a3),d3
  1902.         sub.l    (starttime+4-buffers,a3),d3
  1903.  
  1904.         move.l    (n_blit-buffers,a3),d0
  1905.  
  1906. ; branch if this is not the first time through
  1907.  
  1908.         bset    #0,(firsttimeflag-buffers,a3)
  1909.         bne.b    simple
  1910.  
  1911. ; calculate new partition point for next call using formula
  1912.  
  1913.         moveq    #10,d4
  1914.         lsr.l    d4,d2            ; scale t_blit (avoid overflow)
  1915.         lsr.l    d4,d3            ; scale t_cpu
  1916.         lsr.l    #4,d0            ; scale n_blit
  1917.         mulu    d0,d3            ; d3 = n_blit*t_cpu
  1918.         move.w    #(pixels/32)>>4,d1    ; n (scaled)
  1919.         sub.w    d0,d1
  1920.         mulu    d2,d1            ; d1 = (n-n_blit)*t_blit
  1921.         add.w    d3,d1
  1922.         beq.b    alldone            ; never divide by 0!
  1923.         mulu    #(pixels/32)>>4,d3    ; n (scaled)
  1924.         divu    d1,d3
  1925.         moveq    #0,d0
  1926.         move.w    d3,d0
  1927.         lsl.l    #4,d0            ; scale back n_blit
  1928.         bra.b    done
  1929.  
  1930. ; simple-minded adjustment
  1931.  
  1932. simple:        sub.l    d3,d2            ; blittime-cputime
  1933.         beq.b    alldone            ; can't do better than this
  1934.         bgt.b    1$
  1935. ; blittime < cputime, increase n_blit
  1936.         addq.l    #8,d0
  1937.         cmp.l    #pixels/32,d0
  1938.         bcs.b    done
  1939.         bra.b    alldone            ; don't go out of range
  1940. ; blittime > cputime, decrease n_blit
  1941. 1$:        subq.l    #8,d0
  1942.         bhi.b    done
  1943.         bra.b    alldone            ; don't go out of range
  1944.  
  1945. ; save the new partition point
  1946.  
  1947. done:        move.l    d0,(n_blit-buffers,a3)
  1948.         lsl.l    #2,d0
  1949.         move.l    d0,(plsiz_blit-buffers,a3)
  1950.         lsl.l    #3,d0
  1951.         move.l    d0,(pixels_blit-buffers,a3)
  1952.  
  1953. ; all done!
  1954.  
  1955. alldone:    movem.l    (sp)+,d2-d7/a2-a6
  1956.         rts
  1957.  
  1958. ;-----------------------------------------------------------------------------
  1959. ; QBlit functions (called asynchronously)
  1960.  
  1961. blit11:        moveq    #-1,d0
  1962.         move.l    d0,(bltafwm,a0)
  1963.         move.l    #(8<<16)+8,(bltbmod,a0)    ; also loads bltamod
  1964.         move.w    #0,(bltdmod,a0)
  1965.         move.l    #buff0,(bltapt,a0)    ; buff0
  1966.         move.l    #buff0+8,(bltbpt,a0)    ; buff0+8
  1967.         move.w    #%1111111100000000,(bltcdat,a0)
  1968.         move.l    #buff1,(bltdpt,a0)    ; buff1
  1969.         move.l    #$0DE48000,(bltcon0,a0)    ; D=AC+(B>>8)~C
  1970.         move.l    (pixels_blit-mybltnode,a1),d0
  1971.         lsr.l    #4,d0
  1972.         move.w    d0,(bltsizv,a0)        ; pixels_blit/16
  1973.         move.w    #4,(bltsizh,a0)        ; do blit
  1974.         lea    (blit12,pc),a0
  1975.         move.l    a0,(qblitfunc-mybltnode,a1)
  1976.         rts
  1977.  
  1978. blit12:        move.l    #buff0,d0
  1979.         add.l    (pixels_blit-mybltnode,a1),d0
  1980.         sub.l    #8+2,d0
  1981.         move.l    d0,(bltapt,a0)        ; buff0+pixels_blit-8-2
  1982.         addq.l    #8,d0
  1983.         move.l    d0,(bltbpt,a0)        ; buff0+pixels_blit-2
  1984.         add.l    #buff1-buff0,d0
  1985.         move.l    d0,(bltdpt,a0)        ; buff1+pixels_blit-2
  1986.         move.l    #$8DE40002,(bltcon0,a0)    ; D=(A<<8)C+B~C, desc.
  1987.         move.w    #4,(bltsizh,a0)        ; do blit
  1988.         lea    (blit21,pc),a0
  1989.         move.l    a0,(qblitfunc-mybltnode,a1)
  1990.         rts
  1991.  
  1992. blit21:        move.l    #(4<<16)+4,(bltbmod,a0)    ; also load bltamod
  1993.         move.l    #buff1,(bltapt,a0)
  1994.         move.l    #buff1+4,(bltbpt,a0)
  1995.         move.w    #%1111000011110000,(bltcdat,a0)
  1996.         move.l    #buff0,(bltdpt,a0)
  1997.         move.l    #$0DE44000,(bltcon0,a0)    ; D=AC+(B>>4)~C
  1998.         move.l    (pixels_blit-mybltnode,a1),d0
  1999.         lsr.l    #3,d0
  2000.         move.w    d0,(bltsizv,a0)        ; pixels_blit/8
  2001.         move.w    #2,(bltsizh,a0)        ; do blit
  2002.         lea    (blit22,pc),a0
  2003.         move.l    a0,(qblitfunc-mybltnode,a1)
  2004.         rts
  2005.  
  2006. blit22:        move.l    #buff1,d0
  2007.         add.l    (pixels_blit-mybltnode,a1),d0
  2008.         subq.l    #2+4,d0
  2009.         move.l    d0,(bltapt,a0)        ; buff1+pixels_blit-2-4
  2010.         addq.l    #4,d0
  2011.         move.l    d0,(bltbpt,a0)        ; buff1+pixels_blit-2
  2012.         add.l    #buff0-buff1,d0
  2013.         move.l    d0,(bltdpt,a0)        ; buff0+pixels_blit-2
  2014.         move.l    #$4DE40002,(bltcon0,a0)    ; D=(A<<4)C+B~C, desc.
  2015.         move.w    #2,(bltsizh,a0)        ; do blit
  2016.         lea    (blit31,pc),a0
  2017.         move.l    a0,(qblitfunc-mybltnode,a1)
  2018.         rts
  2019.  
  2020. blit31:        move.l    #(2<<16)+2,(bltbmod,a0)    ; also load bltamod
  2021.         move.l    #buff0,(bltapt,a0)
  2022.         move.l    #buff0+2,(bltbpt,a0)
  2023.         move.w    #%1100110011001100,(bltcdat,a0)
  2024.         move.l    #buff1,(bltdpt,a0)
  2025.         move.l    (pixels_blit-mybltnode,a1),d0
  2026.         lsr.l    #2,d0
  2027.         move.w    d0,(bltsizv,a0)        ; pixels_blit/4
  2028.         move.l    #$0DE42000,(bltcon0,a0)    ; D=AC+(B>>2)~C
  2029.         move.w    #1,(bltsizh,a0)        ; do blit
  2030.         lea    (blit32,pc),a0
  2031.         move.l    a0,(qblitfunc-mybltnode,a1)
  2032.         rts
  2033.  
  2034. blit32:        move.l    #buff0,d0
  2035.         add.l    (pixels_blit-mybltnode,a1),d0
  2036.         subq.l    #2+2,d0
  2037.         move.l    d0,(bltapt,a0)        ; buff0+pixels_blit-2-2
  2038.         addq.l    #2,d0
  2039.         move.l    d0,(bltbpt,a0)        ; buff0+pixels_blit-2
  2040.         add.l    #buff1-buff0,d0
  2041.         move.l    d0,(bltdpt,a0)        ; buff1+pixels_blit-2
  2042.         move.l    #$2DE40002,(bltcon0,a0)    ; D=(A<<2)C+B~C, desc.
  2043.         move.w    #1,(bltsizh,a0)        ; do blit
  2044.         lea    (blit41,pc),a0
  2045.         move.l    a0,(qblitfunc-mybltnode,a1)
  2046.         rts
  2047.  
  2048. blit41:        moveq    #0,d0
  2049.         move.l    d0,(bltbmod,a0)        ; also load bltamod
  2050.         move.l    #buff1,d0
  2051.         move.l    d0,(bltapt,a0)        ; buff1+0*plsiz_blit
  2052.         add.l    (plsiz_blit-mybltnode,a1),d0
  2053.         move.l    d0,(bltbpt,a0)        ; buff1+1*plsiz_blit
  2054.         move.l    d0,(tmp_ptr-mybltnode,a1)
  2055.         move.w    #%1010101010101010,(bltcdat,a0)
  2056.         move.l    (plane0-mybltnode,a1),d0
  2057.         add.l    #7*plsiz,d0
  2058.         move.l    d0,(bltdpt,a0)        ; Plane7
  2059.         move.l    (pixels_blit-mybltnode,a1),d0
  2060.         lsr.l    #4,d0
  2061.         move.w    d0,(bltsizv,a0)        ; pixels_blit/16
  2062.         move.l    #$0DE41000,(bltcon0,a0)    ; D=AC+(B>>1)~C
  2063.         move.w    #1,(bltsizh,a0)        ; do blit
  2064.         lea    (blit42,pc),a0
  2065.         move.l    a0,(qblitfunc-mybltnode,a1)
  2066.         rts
  2067.  
  2068. blit42:        move.l    (plsiz_blit-mybltnode,a1),d1
  2069.         move.l    (tmp_ptr-mybltnode,a1),d0
  2070.         add.l    d1,d0
  2071.         move.l    d0,(bltapt,a0)        ; buff1+2*plsiz_blit
  2072.         add.l    d1,d0
  2073.         move.l    d0,(bltbpt,a0)        ; buff1+3*plsiz_blit
  2074.         move.l    d0,(tmp_ptr-mybltnode,a1)
  2075.         move.l    (plane0-mybltnode,a1),d0
  2076.         add.l    #3*plsiz,d0
  2077.         move.l    d0,(bltdpt,a0)        ; Plane3
  2078.         move.w    #1,(bltsizh,a0)        ; do blit
  2079.         lea    (blit43,pc),a0
  2080.         move.l    a0,(qblitfunc-mybltnode,a1)
  2081.         rts
  2082.  
  2083. blit43:        move.l    (plsiz_blit-mybltnode,a1),d1
  2084.         move.l    (tmp_ptr-mybltnode,a1),d0
  2085.         add.l    d1,d0
  2086.         move.l    d0,(bltapt,a0)        ; buff1+4*plsiz_blit
  2087.         add.l    d1,d0
  2088.         move.l    d0,(bltbpt,a0)        ; buff1+5*plsiz_blit
  2089.         move.l    d0,(tmp_ptr-mybltnode,a1)
  2090.         move.l    (plane0-mybltnode,a1),d0
  2091.         add.l    #5*plsiz,d0
  2092.         move.l    d0,(bltdpt,a0)        ; Plane5
  2093.         move.w    #1,(bltsizh,a0)        ;do blit
  2094.         lea    (blit44,pc),a0
  2095.         move.l    a0,(qblitfunc-mybltnode,a1)
  2096.         rts
  2097.  
  2098. blit44:        move.l    (plsiz_blit-mybltnode,a1),d1
  2099.         move.l    (tmp_ptr-mybltnode,a1),d0
  2100.         add.l    d1,d0
  2101.         move.l    d0,(bltapt,a0)        ; buff1+6*plsiz_blit
  2102.         add.l    d1,d0
  2103.         move.l    d0,(bltbpt,a0)        ; buff1+7*plsiz_blit
  2104.         move.l    d0,(tmp_ptr-mybltnode,a1)
  2105.         move.l    (plane0-mybltnode,a1),d0
  2106.         add.l    #1*plsiz,d0
  2107.         move.l    d0,(bltdpt,a0)        ; Plane1
  2108.         move.w    #1,(bltsizh,a0)        ; do blit
  2109.         lea    (blit45,pc),a0
  2110.         move.l    a0,(qblitfunc-mybltnode,a1)
  2111.         rts
  2112.  
  2113. blit45:        move.l    (plsiz_blit-mybltnode,a1),d1
  2114.         move.l    (tmp_ptr-mybltnode,a1),d0
  2115.         add.l    d1,d0
  2116.         subq.l    #2,d0
  2117.         move.l    d0,(bltbpt,a0)        ; buff1+8*plsiz_blit-2
  2118.         sub.l    d1,d0
  2119.         move.l    d0,(bltapt,a0)        ; buff1+7*plsiz_blit-2
  2120.         move.l    d0,(tmp_ptr-mybltnode,a1)
  2121.         move.l    (plane0-mybltnode,a1),d0
  2122.         add.l    d1,d0
  2123.         subq.l    #2,d0
  2124.         move.l    d0,(bltdpt,a0)        ; Plane0
  2125.         move.l    #$1DE40002,(bltcon0,a0)    ; D=(A<<1)C+B~C, desc.
  2126.         move.w    #1,(bltsizh,a0)        ; do blit
  2127.         lea    (blit46,pc),a0
  2128.         move.l    a0,(qblitfunc-mybltnode,a1)
  2129.         rts
  2130.  
  2131. blit46:        move.l    (plsiz_blit-mybltnode,a1),d1
  2132.         move.l    (tmp_ptr-mybltnode,a1),d0
  2133.         sub.l    d1,d0
  2134.         move.l    d0,(bltbpt,a0)        ; buff1+6*plsiz_blit-2
  2135.         sub.l    d1,d0
  2136.         move.l    d0,(bltapt,a0)        ; buff1+5*plsiz_blit-2
  2137.         move.l    d0,(tmp_ptr-mybltnode,a1)
  2138.         move.l    (plane0-mybltnode,a1),d0
  2139.         add.l    #4*plsiz-2,d0
  2140.         add.l    d1,d0
  2141.         move.l    d0,(bltdpt,a0)        ; Plane4
  2142.         move.w    #1,(bltsizh,a0)        ; do blit
  2143.         lea    (blit47,pc),a0
  2144.         move.l    a0,(qblitfunc-mybltnode,a1)
  2145.         rts
  2146.  
  2147. blit47:        move.l    (plsiz_blit-mybltnode,a1),d1
  2148.         move.l    (tmp_ptr-mybltnode,a1),d0
  2149.         sub.l    d1,d0
  2150.         move.l    d0,(bltbpt,a0)        ; buff1+4*plsiz_blit-2
  2151.         sub.l    d1,d0
  2152.         move.l    d0,(bltapt,a0)        ; buff1+3*plsiz_blit-2
  2153.         move.l    d0,(tmp_ptr-mybltnode,a1)
  2154.         move.l    (plane0-mybltnode,a1),d0
  2155.         add.l    #2*plsiz-2,d0
  2156.         add.l    d1,d0
  2157.         move.l    d0,(bltdpt,a0)        ; Plane2
  2158.         move.w    #1,(bltsizh,a0)        ; do blit
  2159.         lea    (blit48,pc),a0
  2160.         move.l    a0,(qblitfunc-mybltnode,a1)
  2161.         rts
  2162.  
  2163. blit48:        move.l    (plsiz_blit-mybltnode,a1),d1
  2164.         move.l    (tmp_ptr-mybltnode,a1),d0
  2165.         sub.l    d1,d0
  2166.         move.l    d0,(bltbpt,a0)        ; buff1+2*plsiz_blit-2
  2167.         sub.l    d1,d0
  2168.         move.l    d0,(bltapt,a0)        ; buff1+1*plsiz_blit-2
  2169.         move.l    (plane0-mybltnode,a1),d0
  2170.         add.l    #6*plsiz-2,d0
  2171.         add.l    d1,d0
  2172.         move.l    d0,(bltdpt,a0)        ; Plane6
  2173.         move.w    #1,(bltsizh,a0)        ; do blit
  2174.         lea    (blit11,pc),a0
  2175.         move.l    a0,(qblitfunc-mybltnode,a1)
  2176.         moveq    #0,d0            ; set Z flag
  2177.         rts
  2178.  
  2179. qblitcleanup:    movem.l    a2/a6,-(sp)
  2180.         move.l    #mybltnode,a2
  2181.         lea    (endblittime-mybltnode,a2),a0
  2182.         move.l    (timerbase-mybltnode,a2),a6
  2183.         jsr    (_LVOReadEClock,a6)    ; may be called from interrupts
  2184.         sf    (waitflag-mybltnode,a2)
  2185.         movem.l    (sp)+,a2/a6
  2186.         rts
  2187.  
  2188. ;-----------------------------------------------------------------------------
  2189.  
  2190.         section    data,data
  2191.  
  2192.         quad
  2193. buffers:    dc.l    0,0,0,0,0,0,0,0
  2194. mybltnode:    dc.l    0        ; next bltnode
  2195. qblitfunc:    dc.l    blit11        ; ptr to qblitfunc()
  2196.         dc.b    cleanup        ; stat
  2197.         dc.b    0        ; filler
  2198.         dc.w    0        ; blitsize
  2199.         dc.w    0        ; beamsync
  2200.         dc.l    qblitcleanup    ; ptr to qblitcleanup()
  2201.  
  2202.         quad
  2203. chunky:        dc.l    0        ; ptr to original chunky data
  2204. plane0:        dc.l    0        ; ptr to output planes
  2205. pixels_blit:    dc.l    pixels/2    ; number of pixels handled by blitter
  2206. plsiz_blit:    dc.l    pixels/8/2    ; & corresponding (partial) planesize
  2207. n_blit:        dc.l    pixels/32/2    ; number of 32-byte units for blitter
  2208. tmp_ptr:    dc.l    0
  2209. gfxbase:    dc.l    0
  2210. timerbase:    dc.l    0
  2211. starttime:    dc.l    0,0
  2212. endblittime:    dc.l    0,0
  2213. endcputime:    dc.l    0,0
  2214. waitflag:    dc.b    0
  2215. firsttimeflag:    dc.b    0
  2216.  
  2217. ;-----------------------------------------------------------------------------
  2218.  
  2219.         section    bss,bss,chip    ; MUST BE IN CHIP !!!!!
  2220.  
  2221.         quad
  2222. buff0:        ds.b    pixels        ;Intermediate buffer 1
  2223. buff1:        ds.b    pixels        ;Intermediate buffer 1
  2224.  
  2225. ;-----------------------------------------------------------------------------
  2226.  
  2227.         end
  2228.  
  2229. ;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*
  2230.